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 } };
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;
{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;
@ M.M Действительно. Не знаю, почему я это написал. Исправлена. Полагаю, я пытался предупредить о передаче указателя на сложный литерал вне области, где он был объявлен. – Lundin
Никогда не было хорошего использования для «указателя на массив» в C. Оно просто затушевывает код без каких-либо преимуществ. Просто объявите и инициализируйте массив и используйте указатели на его тип элемента. –
@LeeDanielCrocker: Это неверно - указатель на массив является наиболее эффективным способом динамического выделения многомерного массива (как в 'int (* a) [5] = malloc (nrows * sizeof * a);') – caf
Да, это довольно просто, но это применимо только тогда, когда вы знаете внутреннее измерение во время компиляции, а не в более общем случае. –