2013-07-25 3 views
15
int (*a)[5]; 

Как инициализировать указатель на массив из 5 целых чисел, показанных выше.Инициализация «указатель на массив целых чисел»

Правильное ли выражение ниже?

int (*a)[3]={11,2,3,5,6}; 
+0

Никогда не было хорошего использования для «указателя на массив» в C. Оно просто затушевывает код без каких-либо преимуществ. Просто объявите и инициализируйте массив и используйте указатели на его тип элемента. –

+4

@LeeDanielCrocker: Это неверно - указатель на массив является наиболее эффективным способом динамического выделения многомерного массива (как в 'int (* a) [5] = malloc (nrows * sizeof * a);') – caf

+0

Да, это довольно просто, но это применимо только тогда, когда вы знаете внутреннее измерение во время компиляции, а не в более общем случае. –

ответ

14

Предположим, что у вас есть массив 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 } }; 
+0

Я хочу объявить и инициализировать в одной строке ... – EnterKEY

+1

@ Неверная вторая попытка, как 'int (* a) [5] = (int (*) [5]) & ({11,2,3,5 , 6}); 'с новым компилятором –

+1

' int (* a) [5] = (int [] [5]) {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}; ' – caf

0
int vals[] = {1, 2}; 
int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals; 

и то вы получаете доступ к содержимому массива, как в:

(*arr)[0] = ... 
+0

право, спасибо, что нашли опечатку –

1
int a1[5] = {1, 2, 3, 4, 5}; 
int (*a)[5] = &a1; 
4

{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; 
+0

@ M.M Действительно. Не знаю, почему я это написал. Исправлена. Полагаю, я пытался предупредить о передаче указателя на сложный литерал вне области, где он был объявлен. – Lundin