Ответ 1
Когда вы объявляете многомерный массив, вы должны явно определить размер всех, кроме последнего измерения. В противном случае компилятор не будет знать, как найти заданное значение в массиве.
edit: прочитайте мое сообщение здесь
Я получаю ошибку в компиляции со следующим определением.
int matrix[ ][ ] = { { 1, 2, 3}, {4,5,6} };
char str[ ][ ] = { "abc", "fgh" };
Почему компилятор жалуется на отсутствующий индекс и слишком много инициализаторов.
Когда вы объявляете многомерный массив, вы должны явно определить размер всех, кроме последнего измерения. В противном случае компилятор не будет знать, как найти заданное значение в массиве.
edit: прочитайте мое сообщение здесь
Если массив определен как int arr[ ROWS ][ COLS ];
, тогда любая нотация массива arr[ i ][ j ]
может быть переведена на нотацию указателя как
*( arr + i * COLS + j )
Обратите внимание, что выражение требует только COLS, оно не требует ROWS. Итак, массив определение можно записать эквивалентно как
int arr [][ COLS ];
Но отсутствие второго измерения неприемлемо.
Дальнейшее понимание может быть достигнуто с помощью трех приведенных ниже примеров.
Во всех трех примерах одна и та же запись массива arr[ 2 ][ 3 ]
переводится в указатель
обозначение.
Между A и B, ROWS одинаково, но COLS отличается; result = обозначение указателя отличается.
Между A и C, ROWS отличается, но COLS одинаково; result = обозначение указателя такое же.
Примеры:
A. int arr[ 4 ][ 7 ]; arr[2][3] = arr + 2 * 7 + 3 = arr + 17
B. int arr[ 4 ][ 5 ]; arr[2][3] = arr + 2 * 5 + 3 = arr + 13
C. int arr[ 6 ][ 7 ]; arr[2][3] = arr + 2 * 7 + 3 = arr + 17
Try
include <string>
и
string str[] = { "abc", "fgh" };
int matrix[2][3] = { { 1, 2, 3}, {4,5,6} };
char str[2][4] = { "abc", "fgh" };
первая декларация сделает 2d int array имеющей 2 строки с 3 col.
второй будет делать массив 2d char с двумя строками и 4 столбцами.
4-й элемент в каждой строке массива char - это NULL
char