Указатели
Указатель - это переменная, содержащая адрес другой переменной.
Указатели очень широко используются в языке C. Это происходит отчасти
потому, что иногда они дают единственную возможность выразить нужное действие, а
отчасти потому, что они обычно ведут к более компактным и эффективным
программам, чем те, которые могут быть получены другими способами.
Так как указатель содержит адрес объекта, это дает возможность "косвенного"
доступа к этому объекту через указатель. Предположим, что х -
переменная, например, типа int, а рх -
указатель, созданный неким еще не указанным способом. Унарная
операция & выдает адрес объекта, так что оператор
присваивает адрес x переменной px;
говорят, что px "указывает" на x. Операция & применима
только к переменным и элементам массива, конструкции вида:
являются незаконными.
Нельзя также получить адрес регистровой переменной.
Унарная операция * рассматривает свой операнд как адрес конечной цели
и обращается по этому адресу, чтобы извлечь содержимое. Следовательно, если
y тоже имеет тип int, то
присваивает y содержимое того, на что
указывает px. Так последовательность
присваивает y то же самое значение, что и
оператор
переменные, участвующие во всем этом необходимо описать:
C описанием для x и y мы уже
неодонократно встречались. Описание указателя
является новым и должно рассматриваться как
мнемоническое; оно говорит, что комбинация *px имеет тип int. Это
означает, что если px появляется в контексте *px, то это
эквивалентно переменной типа int. Фактически синтаксис описания
переменной имитирует синтаксис выражений, в которых эта переменная может
появляться. Это замечание полезно во всех случаях, связанных со сложными
описаниями.Например,
говорит, что atof() и *dp имеют в
выражениях значения типа double.Вы должны также заметить, что из этого
описания следует, что указатель может указывать только на определенный вид
объектов.
Указатели могут входить в выражения. Например, если px указывает на
целое x, то *px может появляться в любом контексте, где может
встретиться x. Например
y = *px + 1;//присваивает y значение, на 1 большее значения x;
cout<< *px;//выводит текущее значение x;
d = sqrt((double) *px)//получает в d квадратный корень из x,
причем до передачи функции sqrt значение x преобразуется к типу double.
|
В выражениях вида
унарные операции * и & связаны
со своим операндом более крепко, чем арифметические операции, так что такое
выражение берет то значение, на которое указывает рх, прибавляет 1 и
присваивает результат переменной y.Мы вскоре вернемся к тому, что может
означать выражение
Ссылки на указатели могут появляться и в левой части присваиваний. Если
px указывает на x, то
полагает х равным нулю, а
увеличивает его на единицу, как и выражение
Круглые скобки в последнем примере необходимы;
если их опустить, то поскольку унарные операции, подобные * и ++,
выполняются справа налево, это выражение увеличит px, а не ту переменную,
на которую он указывает.
И наконец, так как указатели являются переменными, то с ними можно
обращаться, как и с остальными переменными. Если py - другой указатель на
переменную типа int, то
копирует содержимое рх в py, в
результате чего py указывает на то же, что и px.
|