Концепция указателей открыта и проста, так как индексы имеют определенное значение. Однако в случае, когда один указатель указывает на другой, могут возникнуть проблемы, указатель на указатель является формой многочисленного перенаправления или цепочки указателей.
Рисунок: Одиночное перенаправление.
указатель переменная
Рисунок: Многочисленное перенаправление.
Указатель указатель переменная
В случае обычных указателей указатель содержит адрес некоторого участка памяти, содержащего некоторые значение. В случае указателя на указатель, первый указатель содержит адрес второго, который в свою очередь содержит адрес участка памяти, содержащего некоторое значение.
Многочисленное перенаправление может и дальше расширяться, но существует не много случаев, когда необходимо что-то более мощное, чем указатель на указатель, излишнее перенаправление приводит к концептуальным ошибкам, которые трудно исправлять. Переменная, являющаяся указателем на указатель, должна быть описана следующим образом. Это выполняется путем помещения 2-х * * перед именем.
Например, следующее объявление сообщает компилятору, что newbalance это указатель типа float
float * * newbalance;
При этом newbalance – это не указатель на число с плавающей точкой, а указатель на указатель на вещественное число. Для получения доступа к целевому значению, косвенно указываемому указатель на указатель, следует применить оператор " * " два раза, как показано в следующем примере.
Пример:
# include < stdio.h >
int main (void)
{ int x, * p, * * q;
x = 10;
p = & x;
printf (" % d", * * q); / * вывод значения х * /
return 0;
}