Информатика и технология программирования

         

Присваивание указателей различного типа


Операцию присваивания указателей различных типов следует понимать как назначение указателя в левой части на ту же самую область памяти, на которую назначен указатель в правой. Оба указателя после присваивания содержат один и тот же адрес. Но поскольку тип указуемых переменных у них разный, то эта область памяти по правилам интерпретации указателя будет рассматриваться как заполненная переменными либо одного, либо другого типа:


char *p, A[20];
int *q;
long *l;
p = A; q = (int*)p; l = (long*)p;

В этом примере p -указатель на область байтов, q -на область целых, l -на область длинных целых. Соответственно операции адресной арифметики *(p+i), *(q+i), *(l+i) или p[i], q[i], l[i] адресуют i-ый байт, i-ое целое и i-ое длинное целое от начала области:


p[2] = 5; // записать 5 во второй байт области A


q[1] = 7; // записать 7 в первое слово области A

Таким образом, область памяти имеет различную структуру (байтовую, словную и т.д.) в зависимости от того, через какой указатель мы с ней работаем. При этом неважно, что сама область определена как массив типа char -это имеет отношение только к операциям с использованием идентификатора массива.

Присваивание значения указателя одного типа указателю другого типа сопровождается действием, которое называется в Си ПРЕОБРАЗОВАНИЕМ ТИПА УКАЗАТЕЛЯ. В Си++ оно должно быть обозначено явно в виде операции преобразования типа, в классическом Си выполняется автоматически. На самом деле это действие является чистой фикцией (команды транслятором не генерируются). Транслятор просто запоминает, что тип указуемой переменной изменился и операции адресной арифметики и косвенного обращения нужно выполнять с учетом нового типа указателя.

Таким образом, операция присваивания указателя включает в себя:



-явное преобразование типа указателя от правого к левому ;



-присваивание адреса от правого указателя к левому.



Содержание раздела