Поскольку никто не сказал этого: если вы хотите иметь указатель на 2D-массив, вы можете (вероятно) сделать что-то вроде
int (*p)[][3] = &(int[][3]) {{1,2,3},{4,5,6}};
РЕДАКТИРОВАТЬ: Или вы можетеуказатель на первый элемент через
int (*p)[3] = (int[][3]) {{1,2,3},{4,5,6}};
Причина, по которой ваш пример не работает, заключается в том, что {{1,2,3},{4,5,6}}
не является допустимым инициализатором для типа int*[]
(потому что {1,2,3}
не является допустимыминициализатор для int*
).Обратите внимание, что это , а не и int[2][3]
- это просто недопустимое выражение.
Причина, по которой он работает для строк, заключается в том, что "one"
является допустимым инициализатором для char[]
и char[N]
(для некоторых N> 3).Как выражение , оно приблизительно эквивалентно (const char[]){'o','n','e','\0'}
, за исключением того, что компилятор не слишком жалуется, когда теряет константность.
И да, есть большая разницамежду инициализатором и выражением.Я почти уверен, что char s[] = (char[]){3,2,1,0};
- это ошибка компиляции в C99 (и, возможно, C ++ pre-0x).Также есть множество других вещей, но T foo = ...;
- это инициализация переменной, а не присваивание, даже если они похожи.(Они особенно отличаются в C ++, поскольку оператор присваивания не вызывается.)
И причина путаницы с указателями:
- Тип
T[]
неявно преобразуется в типT*
(указатель на его первый элемент) при необходимости. T arg1[]
в списке аргументов функции фактически означает T * arg1
.Вы не можете передать массив в функцию по различным причинам.Это невозможно.Если вы попытаетесь, вы на самом деле передаете указатель на массив.(Однако вы можете передать структуру, содержащую массив фиксированного размера, в функцию.) - Они могут быть разыменованы и подписаны с идентичной (я думаю) семантикой.
РЕДАКТИРОВАТЬ: Наблюдатель может заметить, что мой первый пример примерно синтаксически эквивалентен int * p = &1;
, что является недействительным.Это работает в C99, потому что составной литерал внутри функции «имеет автоматическую продолжительность хранения, связанную с включающим блоком» ( ISO / IEC 9899: TC3 ).