Главная » Статьи » Програмування » C [ Добавить статью ]

RUS Уроки по программированию на языке С (Указатели)

Указатели

Указатель - это переменная, содержащая адрес другой переменной. Указатели очень широко используются в языке C. Это происходит отчасти потому, что иногда они дают единственную возможность выразить нужное действие, а отчасти потому, что они обычно ведут к более компактным и эффективным программам, чем те, которые могут быть получены другими способами.

Так как указатель содержит адрес объекта, это дает возможность "косвенного" доступа к этому объекту через указатель. Предположим, что х - переменная, например, типа int, а рх - указатель, созданный неким еще не указанным способом. Унарная операция & выдает адрес объекта, так что оператор

pxх = &x;
присваивает адрес x переменной px; говорят, что px "указывает" на x. Операция & применима только к переменным и элементам массива, конструкции вида:
 &(х-1) и &3
являются незаконными. Нельзя также получить адрес регистровой переменной.

Унарная операция * рассматривает свой операнд как адрес конечной цели и обращается по этому адресу, чтобы извлечь содержимое. Следовательно, если y тоже имеет тип int, то

y = *px;
присваивает y содержимое того, на что указывает px. Так последовательность
px = &x;
y = *px;
присваивает y то же самое значение, что и оператор
y = x;

переменные, участвующие во всем этом необходимо описать:

int x, y;
int *px;
C описанием для x и y мы уже неодонократно встречались. Описание указателя
int *px;
является новым и должно рассматриваться как мнемоническое; оно говорит, что комбинация *px имеет тип int. Это означает, что если px появляется в контексте *px, то это эквивалентно переменной типа int. Фактически синтаксис описания переменной имитирует синтаксис выражений, в которых эта переменная может появляться. Это замечание полезно во всех случаях, связанных со сложными описаниями.Например,
double atof(), *dp;
говорит, что 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.

В выражениях вида

y = *px + 1;
унарные операции * и & связаны со своим операндом более крепко, чем арифметические операции, так что такое выражение берет то значение, на которое указывает рх, прибавляет 1 и присваивает результат переменной y.Мы вскоре вернемся к тому, что может означать выражение
y = *(px + 1);

Ссылки на указатели могут появляться и в левой части присваиваний. Если px указывает на x, то

*px = 0;
полагает х равным нулю, а
*px += 1;
увеличивает его на единицу, как и выражение
(*px) + 1;
Круглые скобки в последнем примере необходимы; если их опустить, то поскольку унарные операции, подобные * и ++, выполняются справа налево, это выражение увеличит px, а не ту переменную, на которую он указывает.

И наконец, так как указатели являются переменными, то с ними можно обращаться, как и с остальными переменными. Если py - другой указатель на переменную типа int, то

py = px;
копирует содержимое рх в py, в результате чего py указывает на то же, что и px.

Категория: C | Добавил: DEN-SHP (05.11.2012)
Просмотров: 507 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]