Почему я не могу в качестве значения указателя **p присвоить название двумерного массива? Помогите разобраться
Если я всё правильно понял, то при создании двумерного массива arr[2][3] создаётся переменная-указатель arr, которая указывает на безымянный массив из 2 указателей. Каждый из этих 2 указателей указывает на одномерный массив длиной в [3] элемента. Выходит указатель на указатель. Название массива указывает на первый элемент (в нашем случае этот элемент - указатель на одномерный массив). Однако при присваивании *pp = arr возникает ошибка..
Мы можем по другому указать на двумерный массив.
int arr[2][3] { {1, 2, 3}, {4, 5, 6} };
int (*p)[3] = arr; //указатель на массив из 3 элементов, т.е. arr[0]
Однако при просмотре следующих адресов и значений у меня появляется множество вопросов.
cout << p << " Значение p" << endl;
cout << *arr << " Значение arr" << endl;
cout << &arr << " Адрес arr" << endl;
cout << &arr[0] << " Адрес arr[0]" << endl;
cout << &arr[0][0] << " Адрес arr[0][0]" << endl;
cout << *arr[0] << " Значение arr[0]" << endl;
0000002FD98FF7A8 Значение p
0000002FD98FF7A8 Значение arr
0000002FD98FF7A8 Адрес arr
0000002FD98FF7A8 Адрес arr[0]
0000002FD98FF7A8 Адрес arr[0][0]
1 Значение arr[0]
Я могу ещё понять совпадение значения arr и адреса arr[0], но остальные совпадения и единица для меня загадка.. Будто бы и не создавался никакой безымянный массив с указателями, а название просто указывает на самый первый элемент.. Где-то я видимо что-то не так понял, либо чего-то не знаю. Помогите понять
Ответы (1 шт):
Нет, вы получаете указатель не на массив указателей, а на блок памяти из 2*3 = 6 int'ов. Просто компилятор точно знает размер массива, так что ему не сложно обратиться к элементу, скажем, arr[1][1] как к 1*3+1 = 4-му элементу в этом блоке intов.
