В памяти массив char a[4] = {1, 2, 3, 4}
выглядит следующим образом:
[(1)(2)(3)(4)]
с ()
, представляющим байт памяти, и []
, указывающим, где начинается массив / заканчивается.
Массив char a[2][2] = {{1, 2}, {3, 4}}
выглядит в памяти следующим образом:
[[(1)(2)][(3)(4)]]
Видите, разницы нет, поскольку []
на самом деле не существует в памяти они просто подсказки, которые я использовал в своем ответе. Фактически, если вы ничего не знаете о массивах и просто просматриваете содержимое необработанных байтов в памяти, вы увидите:
(1)(2)(3)(4)
в в обоих case.
Таким образом, вместо создания массива a[Xmax][Ymax]
и доступа к элементам с помощью a[x][y]
, вы также можете создать массив как b[Xmax * Ymax]
и обращаться к элементам с помощью b[x * Xmax + y]
, так как это на самом деле то, что происходит за кулисами в любом случае.
А в C вы всегда можете превратить ссылку на массив в указатель, так как ссылка на массив является ссылкой на область памяти, где расположен массив, и указатель является ссылкой на область памяти (независимо от того, находится ли там массив или нет). Так что
int a[5] = { ... };
int * b = a;
работает как a
- это ссылка на массив int, который представляет собой всего несколько значений int, хранящихся в памяти, а b
- указатель на область памяти, где хранится значение int. , Ну, по адресу, с которого начинается массив a
, сохраняется значение int , так что это присваивание совершенно правильно.
И m[3]
просто означает " увеличить адрес памяти m
ссылается три раза по размеру типа m
ссылки и извлекает значение из этого адреса". И это работает и возвращает ожидаемое значение, независимо от того, является ли m
указателем или ссылкой на массив. Таким образом, хотя этот синтаксис на самом деле предназначен для доступа к массиву, он также работает с указателями.
Синтаксис для указателя будет на самом деле *(m + 3)
, что означает, что " увеличит адрес указателя в три раза на размер типа значения, на которое он указывает, а затем извлекает значение из этого адреса". Тем не менее, только в первом случае этот синтаксис будет работать и со ссылкой на массив, так как ссылка на массив всегда может стать указателем при необходимости.