@dandropov95

Как разобраться с указателем на указатель на массив?

Что происходит в данном случае int ** ptr = &arr;? Получается что далее ptr == arr == &arr. Почему нельзя получить указатель на указатель на массив в данном случае?
Как будет выглядеть указатель на указатель схематично если ему присвоить адрес элемента, а не адрес указателя? В таком случае получится что можно будет получить значение одинарным разыменованием, а при двойном получается ошибка сегментации.

#include <stdio.h>

int main(void)
{
	int arr[4] = {1, 2, 3, 4};
	int ** ptr = &arr;
	
	int value = 12;
	int * value_ptr = &value;
	int ** value_ptr_ptr = &value_ptr;
	
	printf("%d\n", **value_ptr_ptr); // 12

	printf("%d", *ptr); // 1
	// printf("%d", **ptr); // error

	return 0;
}
  • Вопрос задан
  • 231 просмотр
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Что происходит в данном случае
int ** ptr = &arr;

Происходит initialization from incompatible pointer type.

Получается что далее ptr == arr == &arr

== использованное в смысле "численно равно" действительно имеет место. Но типы этих трёх значений разные: int **/int[4]/int (*)[4]

Почему нельзя получить указатель на указатель на массив в данном случае?

Потому что, чтобы получить указатель на указатель, надо этот второй указатель иметь. Массив -- это не указатель.
Вот так будет работать:
#include <stdio.h>

int main(void)
{
  int arr[4] = {1, 2, 3, 4};
  int *pa = arr;
  int ** ptr = &pa;

  printf("%d", **ptr); // 1
  return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы