При определении указателя целесообразно выполнить его инициализацию, то есть присвоение начального значения. Использование в программах неинициализированных указателей приводит к ошибкам. Инициализатор записывается после имени указателя в двух формах:
тип *имя_указателя = инициализирующее_выражение;
тип *имя_указателя (инициализирующее_выражение);
Например,
// a,c – указатели на int, b – переменная типа int
int *a(NULL), b = 7, *c = &b; // & - операция
// получения адреса
NULL – стандартная константа (определена в stdio.h как 0), характеризующая неопределённое значение указателя. Адреса в памяти с нулевым значением не существует.
Для доступа к участку памяти, связанному с указателем, к переменной-указателю применяется унарная операция «*» косвенной адресации, иначе называемая операцией разыменования (разадресации) или операцией раскрытия ссылки или обращения по адресу (операндом всегда является указатель):
*c = 11; // b также становится равной 11
Различают указатели-переменные и указатели-константы:
|
|
int i; // Целочисленная переменная
const int ci = 100; // Целочисленная константа
// Указатель на целочисленную переменную
int *pi = &i;
// Указатель на целочисленную константу
const int * pci = &ci;
// Указатель-константа на целочисленную переменную
int * const cp = &i;
// Указатель-константа на целочисленную константу
const int * const cpc = &ci;
Указатель на void может ссылаться на объект любого типа, его можно сравнивать с любым указателем, но к нему нельзя применять операцию разыменования «*» (требуется предварительно преобразовать его к указателю на конкретный тип данных):
void * ptr;
ptr = a;
int * c = (int*)ptr;
Указатели подчиняются общим правилам определения области действия, видимости и времени жизни переменных.