2012-05-14 3 views
1

Смотря код нашел в интернете я наткнулся на этот кусок кода:распределение матрицы в одной строке

int (*p)[3]; 

p = (int(*)[3]) calloc(5*3,sizeof(int)); 

это просто способ Alloc матрицу?

Я понимаю, что int (*p)[3] создает указатель на массив из 3 междунар, но я не уверен, о calloc вызове: Я знаю, что calloc выделить и инициализировать ряд int (в данном случае) равен первый параметр (5*3).
Таким образом, если я назначил его p, это должно означать, что указатель теперь указывает на только что выделенную ячейку памяти.

Итак, поскольку я знаю, что мои рассуждения ошибочны, может кто-нибудь поправить меня?

+0

'ca lloc (m, n) 'выделяет и обнуляет байты памяти' m * n', а не 'm'. –

+0

Да, я имел в виду, что он выделяет 5 * 3 'int'. Я исправил свой вопрос. – user1372813

ответ

3
int (*p)[3]; 

Ты правда, что это указатель на массив из трех целых чисел, но этот указатель может также указывать на начало массив из массивов из трех целых чисел.

Здесь вы указываете 5 * 3 ints этому указателю. Поскольку int[3] имеет 3 ввода, вы выделили 5 таких int[3] массивов.

Затем вы можете обратиться к этим int[3] массивы, как

p[0] ... p[4]

так что вы получите двумерный массив в пределах

p[0][0] ... p[0][2]

p[4][0]. .. p[4][2]

+0

Итак, поскольку 'calloc' выделяет 15' int ', и я получаю матрицу 5 * 3, где находятся исходные три' int'? Они просто выброшены? Если да, то в чем их выделить? Почему мы не можем объявить 'int ** p'? – user1372813

+0

@ user1372813 Перед вызовом 'calloc' нет трехзначных оригиналов. 'int (* p) [3];' является просто объявлением - он создает указатель p, который может указывать на 'int [3]'. Однако, пока вы не инициализируете этот указатель, например 'p = & somearray' или' p = (int (*) [3]) malloc (...) ', он указывает на случайное место в памяти. – Imp

+0

@ user1372813 Кроме того, вы не можете просто объявить '** p'. Объявление 'int (* p) [3];' сообщает компилятору, что второе измерение матрицы равно '3'. Поэтому, если вы пишете, например, 'p [1] [2]', вы получаете значение '* (p + 1 * 3 + 2)'. Без этой информации компилятор не знал бы, как интерпретировать 'p [1] [2]', потому что он не знал, как долго будет первая строка 'p [0]'. – Imp

0

Ваше понимание неверное. calloc выделяет и нули достаточно непрерывной памяти для удерживания 15 int s и возвращает указатель на начало его.

Смежные вопросы