Почему
blockquote>int*[]
распадается наint**
, но неint[][]
?Поскольку с ним было бы невозможно выполнить арифметику указателя.
Например,
int p[5][4]
означает массив (массив длиной-4 изint
). Нет никаких указателей, это просто смежный блок памяти размера5*4*sizeof(int)
. Когда вы запрашиваете конкретный элемент, например.int a = p[i][j]
, компилятор действительно делает это:char *tmp = (char *)p // Work in units of bytes (char) + i * sizeof(int[4]) // Offset for outer dimension (int[4] is a type) + j * sizeof(int); // Offset for inner dimension int a = *(int *)tmp; // Back to the contained type, and dereference
Очевидно, что он может это сделать только потому, что знает размер «внутреннего» измерения (измерений). Передача данных в
int (*)[4]
сохраняет эту информацию; это указатель на (массив длиной-4 изint
). Однакоint **
не ; это просто указатель на (указатель наint
).Для получения этого можно обратиться к следующим разделам FAQ C:
- 6.18: Мой компилятор жаловался, когда я передал двумерный массив функции, ожидающей указателя на указатель.
- 6.19: Как написать функции, которые принимают двумерные массивы, когда
- 6.20: Как я могу использовать статически и динамически распределенные многомерные массивы взаимозаменяемо при передаче их в функции?
](Это все для C, но это поведение практически не изменяется в C ++.)