Поиск строки и возврат только тех вещей, которые я укажу

Почему int*[] распадается на int**, но не int[][]?

blockquote>

Поскольку с ним было бы невозможно выполнить арифметику указателя.

Например, 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:

(Это все для C, но это поведение практически не изменяется в C ++.)

0
задан 0x90 4 April 2012 в 02:32
поделиться