int (*a)[5];
Как инициализировать указатель на массив из 5 целых чисел, показанных выше.
Правильно ли указано выражение?
int (*a)[3]={11,2,3,5,6};
int (*a)[5];
Как инициализировать указатель на массив из 5 целых чисел, показанных выше.
Правильно ли указано выражение?
int (*a)[3]={11,2,3,5,6};
Предположим, что у вас есть массив int длины 5
, например.
int x[5];
Тогда вы можете сделать a = &x;
int x[5] = {1};
int (*a)[5] = &x;
Чтобы получить доступ к элементам массива, вы должны: (*a)[i]
(== (*(&x))[i]
== (*&x)[i]
== x[i]
) скобки, потому что приоритет оператора []
выше, чем *
. (одна общая ошибка может делать *a[i]
для доступа к элементам массива).
Понять, что вы спросили, является ошибкой времени компиляции:
int (*a)[3] = {11, 2, 3, 5, 6};
Это неверно и несовпадение типа, потому что {11,2,3,5,6}
может быть присвоено int a[5];
, и вы назначаете int (*a)[3]
.
Кроме того,
Вы можете сделать что-то вроде одного размера:
int *why = (int p[2]) {1,2};
Аналогично, для двухмерного попробуйте это (спасибо @caf):
int (*a)[5] = (int p[][5]){ { 1, 2, 3, 4, 5 } , { 6, 7, 8, 9, 10 } };
{11,2,3,5,6}
- это список инициализаторов, это не массив, поэтому вы не можете указать на него. Указатель массива должен указывать на массив, имеющий правильную ячейку памяти. Если массив представляет собой именованную переменную или только часть выделенной памяти, это не имеет значения.
Все это сводится к типу массива, в котором вы нуждаетесь. Существуют различные способы объявления массивов в C, в зависимости от цели:
// plain array, fixed size, can be allocated in any scope
int array[5] = {11,2,3,5,6};
int (*a)[5] = &array;
// compound literal, fixed size, can be allocated in any scope
int (*b)[5] = &(int[5]){11,2,3,5,6};
// dynamically allocated array, variable size possible
int (*c)[n] = malloc( sizeof(int[n]) );
// variable-length array, variable size
int n = 5;
int vla[n];
memcpy( vla, something, sizeof(int[n]) ); // always initialized in run-time
int (*d)[n] = &vla;
int vals[] = {1, 2};
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;
а затем вы получите доступ к содержимому массива, как в:
(*arr)[0] = ...
int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;