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

         

Операции над указателями


В процессе определения указателей мы рассмотрели основные операции над указателями:



-операция присваивания указателей одного типа. Назначение указателю адреса переменной p=&#38a есть одни из вариантов такой операции: выражение &#38a является постоянным (константным) указателем такого же типа, что и p;



-операция косвенного обращения по указателю;



-операция адресной арифметики " указатель+целое" и все производные от нее.

Кроме того, имеется еще ряд операций, понимание которых не выходит за рамки "здравого смысла" понятия указателя .

СРАВНЕНИЕ УКАЗАТЕЛЕЙ НА РАВЕНСТВО: равенство указателей однозначно понимается как совпадение адресов, то есть назначение их на одну и ту же область памяти (переменную);

ПРЕОБРАЗОВАНИЕ " УКАЗАТЕЛЬ -ЦЕЛОЕ" : в конечном счете адрес, который представляет собой значение указателя, является обычным машинным словом определенной размерности, чему в Си соответствует целая переменная. Поэтому в Си преобразования типа " указатель-целое" и " целое-указатель" понимаются как получение адреса памяти в виде целого числа и преобразование целого числа в адрес памяти, то есть как работа с реальными адресами памяти компьютера. Такие операции являются в большинстве своем машинно-зависимыми, поскольку требуют знания некоторых тонкостей работы компьютера, операционной системы и транслятора:



-системы преобразования адресов компьютера, размерностей используемых указателей (int или long);



-особенностей распределения памяти транслятором и операционной системой;



-особенностей архитектуры компьютера, связанной с размещением в памяти специальных областей (например, видеопамять экрана).

Естественно, что программа, использующая такие знания, не является переносимой (мобильной) и работает только в рамках определенного транслятора, операционной системы или компьютерной архитектуры.

"ПУСТОЙ" УКАЗАТЕЛЬ: среди множества адресов выделяется такой, который не может быть использован в правильно работающей программе для размещения данных.
Это значение адреса называется NULL-УКАЗАТЕЛЕМ или "пустым" указателем. Считается, что указатель с таким значением не является корректным (указывает "в никуда"). Обычно такое значение определяется в
стандартной библиотеке ввода-вывода в виде &#35define NULL 0.

Значение NULL может быть присвоено любому указателю. Если указатель по логике работы программы может иметь такое значение, то перед косвенным обращением по нему его нужно проверять на достоверность:



int *p,a;
if () p=NULL; else p=&#38a; ...
if (p !=NULL) *p = 5; ...







СРАВНЕНИЕ УКАЗАТЕЛЕЙ НА БОЛЬШЕ-МЕНЬШЕ: при сравнении указателей производится сравнение соответствующих адресов как беззнаковых переменных. Естественный смысл такого сравнения имеется, если оба указателя ссылаются на элементы одного и того же
массива, тогда соотношение " больше-меньше" следует понимать как " ближе-дальше" к началу массива:

// Перестановка элементов массива симметрично середины

int A[20],i,j,x;
for(i=0,j=19; i&#60j; i++, j--)
{ x = A[i]; A[i] = A[j]; A[j] = x; }
int A[20],*pi,*pj,x;
for (pi=A,pj=A+19; pi &#60 pj; pi++, pj--)
{ x = *pi; *pi = *pj: *pj = x; }

РАЗНОСТЬ ЗНАЧЕНИЙ УКАЗАТЕЛЕЙ: в случае, когда указатели ссылаются на один и тот же массив, их разность понимается как "расстояние между ними",
выраженную в количестве указуемых переменных.

Все перечисленные операции, в которых применяются два указателя (присваивание, сравнение, вычитание), рассматривались для указателей с одинаковыми типами указуемых переменных. Случай с использованием указателей различных типов (преобразование типов указателей) имеет особое значение: он вплотную связан с принципами управления памятью в Си-программах и потому рассматривается отдельно (см.4.4).


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