8.1 Общие сведения

Одним из наиболее важных концепций С/С++ является указатель, являющийся переменной, которая используется для хранения адреса. Определить адрес переменной можно с помощью унарной операции &. Например, в следующем фрагменте программы:

#include <stdio.h>

void main(void)

{

int data=10;

float summa=59.032E2;

printf(“Адрес переменной data – %pn”, &data);

printf(“Адрес переменной summa – %pn”, &summa);

}

используется операция & для нахождения адресов некоторых объектов (в данном случае  переменных).

Примечание: для вывода адреса функцией printf() используется формат %р.

После компиляции и выполнения программы на экран выводятся, например, адреса:

Адрес переменной data – 0012FF7C

Адрес переменной summa – 0012FF78

При определении адреса массива операция & может не использоваться, так как само имя массива без индексов является указателем на его первый элемент с нулевым индексом.

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

#include <stdio.h>

void main(void)

{

int data[10];

float summa[20];

printf(“Начальный адрес массива data – %pn”, data);

printf(“Начальный адрес массива summa – %pn”, summa);

}

Поскольку строковые переменные имеют свойства одномерных массивов, их начальные адреса определяются аналогично. Например:

char letter=’A’;

printf(“Адрес letter – %p”, letter);

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

При определении адреса объекта с помощью операции & нужно уметь его сохранять, передавать и преобразовывать. Для этих целей в языке С/С++ введена переменная типа указатель (или просто указатель). Поскольку аппаратные инструкции компьютера в значительной степени основываются на адресах, указатели предоставляют программисту возможность выразить свои требования способом, который очень близок к способу «мышления» компьютера. Благодаря этому программы с указателями являются более эффективными.

Указатели делятся на две основные категории: указатели на объекты и указатели на функции. Указатели обоих типов представляют собой специальные объекты, хранящие адреса памяти. Они имеют отличные друг от друга свойства, назначения и правила манипулирования, хотя и те и другие разделяют между собой определенные операции языка С/ C++.  Указатели на функции используются для доступа к ним и для передачи  аргументов одних функций другим. Выполнение арифметических операций с указателями на функции не допускается. И напротив, указатели на объекты регулярно инкрементируются и декрементируются при сканировании массивов или более сложных структур. Рассмотрим их более подробно.