Не знаю, что тебе уже известно, поэтому начну издалека. Попробую изложить низкоуровневые основы. Терминология никуда не годится, не все здесь точно, но, имхо, так понятнее.
У компа есть память <!--emo&:)-->

<!--endemo-->. У каждого байта памяти есть свой собственный адрес. Байт - это мельчайший адресуемый элемент, т.е. ты не можешь обратиться к отдельному биту памяти - чтобы считать бит памяти, тебе надо считать целый байт, и выделить из него нужный бит.
Нынче память имеет линейную структуру, т.е. каждому байту памяти соответствует 4-байтовое число - его адрес.
Существуют различные типы адресации, т.е. метода обращения процессора к памяти. Нас интересует два - прямая и косвенная адресация. Прямая адресация - это когда команда записана в виде "скопировать байт по адресу A в ячейку B", где A и B - адреса. Занимать такая команда в машинном коде будет скорее всего 9 байт - 1 байт - собственно, команда "скопировать" - MOV (команда одна из базовых, потому занимает немного), 8 байт - два адреса. Когда ты записываешь
- Код: выделить все
a=b;
то это как раз преобразуется в машинную команду такого типа.
Косвенная адресация - хитрее. Когда ты пишешь на Си
- Код: выделить все
*a=*b;
то это преобразуется в команду типа "скопировать содержимое из ячейки по адресу, который хранится в ячейке по адресу A, в ячейку по адресу, который хранится по адресу B". Команда будет занимать столько же байт, как и в прошлой там будет два адреса. Но процессор будет выполнять эту команду хитрее: Он пойдет по адресу A, возьмет 4 байта начиная с этого адреса, интерпретирует эти 4 байт как адрес, по которому лежат интересующие нас данные. Аналогично с B - участок памяти, над которым надо произвести операцию, находится по адресу, который записан в памяти по адресу B.
Значения A и B являются указателями. Указатель - это и есть 4 байта в памяти, в которых хранится адрес интересующих нас данных. Фраза "A указывает на B" эквивалентна фразе "A содержит адрес B".
Но это на низком уровне. Ведь А и В - это адреса, возникает вопрос - как связать адреса с именами переменных? Ведь на высоком уровне мы практически не используем явное задание адресов памяти? Все очень просто. Компилятор все имена переменных преобразует в адреса. Каждая переменная - это на самом деле просто адрес первого байта какой-то структуры в памяти. Если переменная - указатель, то это адрес 4 байт памяти, в которых хранится другой адрес.
Указатель на функцию - это переменная, хранящая адрес первой команды какой-то функции в памяти. Можно передать управление по этому адресу - "вызвать функцию".
яНЯЕД ОН СОПЪФЙЕ: Athlon 64 X2 5200+ @2,86GHz / nF 570 SLI (ASUS M2N SLI Deluxe) / 4 Gb RAM (4x1Gb Kingston) / 2,9Tb SATAII (0,50+0,64+0,75+1,00Tb WD) / ASUS 8800 GTS512 / 2x NEC-Optiarc AD-7173 / Thermaltake ToughPower 650W / 2x30W Microlab Solo-2 / 20" LCD Benq FP202W (wide) / openSUSE 11.1 / KDE 4.2.1
<!--coloro:Navy--><span style="color:Navy"><!--/coloro-->оН БЯЕЛ БНОПНЯЮЛ - Б email. б ICQ ОНЪБКЪЧЯЭ ПЮГ Б ОНКЦНДЮ.<!--colorc--></span><!--/colorc-->