Один указатель может указывать на другой, а тот, свою очередь, — на целевое значение. Это так называемая
Указатель Переменная
адрес - значение
Одноуровневая непрямая адресация
Указатель Указатель Переменная
адрес - адрес - значение
Многоуровневая непрямая адресация Рис. 20.1. Одно- и многоуровневая непрямая адресация
Многоуровневая непрямая адресация может быть продолжена до любого предела, но потребность более чем в двух уровнях адресации по указателям возникает крайне редко. На самом деле чрезмерная непрямая адресация очень трудно прослеживается и чревата ошибками.
Переменная, являющаяся указателем на указатель, должна быть объявлена как таковая. Для этого достаточно указать дополнительный знак * после имени типа переменной. Например, в следующем объявлении компилятор уведомляется о том, что переменная q является указателем на указатель и относится к типу int.
int** q;
Следует, однако, иметь в виду, что переменная q является указателем не на целое значение, а на указатель типа int.
Для доступа к целевому значению, косвенно адресуемому по указателю на указатель, следует дважды применить оператор *, как в приведенном ниже примере.
using System;
class Multiplelndirect {
unsafe static void Main {
int x; // содержит значение типа int
int* p; // содержит указатель типа int
int** q; // содержит указатель на указатель типа int
х = 10;
р = &х; // поместить адрес переменной х в переменной р q = &р; // поместить адрес переменной р в переменной q
Console.WriteLine(**q); // вывести значение переменной х
}
}
Результатом выполнения этой программы будет выведенное на экран значение 10 переменной х. В данной программе переменная р объявляется как указатель на значение типа int, а переменная q — как указатель на указатель типа int.
И последнее замечание: не путайте многоуровневую непрямую адресацию со структурами данных высокого уровня, в том числе связными списками, так как это совершенно разные понятия.
Массивы указателей