double arrow

Операция взятия адреса


Форма записи:

& Идентификатор;

Операция адрес (&) дает адрес своего операнда: если sum есть переменная типа int, тогда &sum есть адрес /ячейка памяти/ этой переменной. Таким образом, если msg есть ссылка на переменную типа char, тогда *msg есть символ, на который указывает msg.

Операндом может быть любое именуемое выражение. Имя функции или массива также может быть операндом операции «адрес», хотя в этом случае знак операции является лишним, так как имена массивов и функций являются адресами. Результатом операции адрес является указатель на операнд. Тип, адресуемый указателем, является типом операнда.

Операция адрес не может применяться к элементам структуры, являющимися полями битов, и к объектам с классом памяти register.

Рассмотрим следующую программу:

void main()

{

int ivar,*iptr;

iptr = &ivar;

ivar = 421;

printf("Размещение ivar: %p\n",&ivar);

printf("Содержимое ivar: %d\n", ivar);

printf("Содержимое iptr: %p\n", iptr);

printf("Адресуемое значение: %d\n",*iptr);

}

В ней объявлены две переменные: ivar и iptr. Первая, ivar - это целая переменная, т.е. содержащая значение типа int. Вторая, iptr - это указатель на целую переменную, следовательно, она содержит АДРЕС значения типа int. Можно также сказать, что переменная iptr - это указатель, так как перед ее описанием стоит звездочка

В основном, данная программа делает следующее:

- адрес переменной ivar присваисвается iptr

- целое значение 421 присваивается ivar

Адресный оператор (&) позволяет получить адрес, по которому размещено значение переменной ivar.

Введя эту программу в свой компьютер и выполнив ее, вы получите следующий результат:

Размещение ivar: 166E

Содержимое ivar: 421

Содержимое iptr: 166E

Адресуемое значение: 421

Первые две строки указывают адрес и содержимое ivar. Третья представляет адрес, содержащийся в iptr. Как видите, это адрес переменной ivar, т.е. место в памяти, где ваша программа решила создать переменную с идентификатором ivar. В последней строке печатается то, что хранится по этому адресу - те же самые данные, которые уже присвоены переменной ivar.

Заметим, что в третьем обращении к функции printf используется выражение iptr, содержимое которого есть адрес ivar. В последнем обращении к printf используется выражение *iptr, которое позволяет получить данные, хранящиеся по этому адресу.

Рассмотрим теперь небольшую вариацию предыдущей программы:

void main()

{

int ivar,*iptr;

iptr = &ivar;

*iptr = 421;

printf("Размещение ivar: %p\n",&ivar);

printf("Содержимое ivar: %d\n", ivar);

printf("Содержимое iptr: %p\n", iptr);

printf("Адресуемое значение: %d\n",*iptr);

}

В этой программе также адрес переменной ivar присваивается iptr, но вместо присваивания числа 421 переменной ivar, это значение присваивается по указателю *iptr. Каков результат ? Точно такой же, как и в предыдущей программе. Почему ? Потому что выражения *iptr и ivar суть одна и та же ячейка памяти - поэтому в этом случае оба оператора заносят значение 421 в одну и ту же ячейку памяти.


Сейчас читают про: