Двумерные массивы в C не работают так, как вы думаете. (Не волнуйтесь, вы не одиноки - это распространенное заблуждение.)
В коде подразумевается, что right
- это массив int *
указателей, каждый из которых указывает на массив int
. Это может быть сделано таким образом - и, что сбивает с толку, синтаксис для доступа к такому массиву будет таким же, что, вероятно, является причиной этого заблуждения.
Что на самом деле C делает , так это делает right
массивом из 12 int
с, расположенным непрерывно в памяти. Доступ к массиву, подобный этому
a=right[i][j];
фактически эквивалентно этому:
int *right_one_dimensional=(int *)right;
a=right[i*3 + j];
Чтобы передать ваш массив в функцию calc
, вам нужно сделать это:
int calc(int *right, size_t d){
// For example
a=right[i*d + j];
}
и затем назовите это так:
int right[2][3] = {
{1,4,6}, {2,7,5}
};
calc(&right[0][0], 3);
Редактировать: Для получения дополнительной информации об этом, вопрос, связанный с в комментарии Binary Worrier, безусловно, стоит посмотреть.