Указатель на указатель
Указатель на указатель является формой многочисленного перенаправления или цепочки указателей (рис.).
Рис. Представление одиночного и многочисленного перенаправлений
В случае одиночного перенаправления указатель содержит адрес некоторого участка памяти, содержащего определенные значение. В случае указателя на указатель реализуется многочисленное перенаправление: первый указатель содержит адрес второго, который в свою очередь содержит адрес участка памяти, содержащего некоторое значение.
Многочисленное перенаправление может и дальше расширяться. Но существует немного случаев, когда необходимо что-то более мощное, чем указатель на указатель. Излишнее перенаправление приводит к концептуальным ошибкам, которые очень трудно исправлять. Переменная, являющаяся указателем на указатель, должна быть описана определенным образом. В С++ это выполняется путем помещения двух звездочек перед именем. Например, следующее объявление сообщает компилятору, что nb – это указатель на указатель типа float:
float **nb;
/*nb – это не указатель на число с плавающей точкой, а указатель на указатель на вещественное число*/
Для получения доступа к значению, адресуемому указателем на указатель, следует применить оператор разыменования * два раза, как показано в следующем примере:
#include <stdio.h>
void main(){
int *p, x, **q;
x = 10;
p = &x;
q = &p;
printf("%d", **q); /* вывод значения х */
}
Здесь р объявляется как указатель на целое, а q – это указатель на указатель на целое. Вызов printf() выводит число 10 на экран.
Так как указатель – это объект в памяти, то можно определять указатель на указатель и т.д. сколько нужно раз. Например, в следующей программе реализовано многочисленное перенаправление и выполнен доступ к значению переменной:
//цепочка указателей на указатели
#include <iostream.h>
void main() {
int i=88;
int *pi=&i;
int **ppi=π
int ***pppi=&ppi;
cout << "\n***pppi = " << ***pppi;
}
Ассоциативность унарной операции разыменования выполняется справа налево, поэтому последовательно обеспечивается доступ к участку памяти с адресом pppi, затем к участку с адресом (*pppi)== ppi, затем к (*ppi)== pi, затем к (*pi)== i. С помощью скобок последовательность разыменований можно пояснить таким выражением *(*(*pppi))).
Дата добавления: 2015-02-16; просмотров: 588;