В C при наявності масиву рядків (якщо довжина цих рядків різна, то маємо вільний масив) можна визначити масив вказівників на ці рядки. В зв’язку з тим, що кожний рядок є масивом, а його ім’я – вказівником-константою, масив вказівників буде містити вказівники на вказівники. Можна описати змінну, яка матиме тип «вказівник на вказівник». Ознакою такого типу є повторення символу «*» при описі змінної. Кількість символів «*» означає кількість рівнів вказівника. Вказівник на вказівник – це область пам’яті, яка зберігає адресу на вказівник. Під час опису вказівник на вказівник може бути ініціалізованим.
Приклад:
int data = 5;
int *ptr = &data; //вказівник на int
int **ptr_ptr = &ptr; //вказівник на вказівник
int ***ptr_ptr_ptr = &ptr_ptr; //вказівник на вказівник
Тоді для звернення до змінної data можна скористатися операцією взяття вмісту за адресою. Усі наведені нижче оператори присвоюють змінній data значення 10.
data = 10;
*ptr = 10;
**ptr_ptr = 10;
***ptr_ptr_ptr = 10;
Для звернення до пам’яті за допомогою вказівників на вказівники можна застосовувати і індекси. Наприклад, еквівалентними є такі посилання на змінну data:
ptr[0] або *ptr
ptr_ptr[0][0] або **ptr_ptr
ptr_ptr_ptr[0][0][0] або ***ptr_ptr_ptr