Умножение матриц — указатели и массивы

Я новичок в программировании на C, так что терпите меня :) У меня есть функция main(), которая генерирует 2D-массив (также известный как матрица). Я попытался определить "внешнюю" функцию matrix_multipl(), которая берет две матрицы из main(), перемножает их и возвращает, что, конечно, вызвало проблемы (вы не можете вернуть массив из функции).

Итак, мой подход следующий, и я хочу знать, правильно ли я понимаю процесс:

Я генерирую массивы (first[m][n], second[o][p] и output[m][p] матрицы) внутри main и оттуда я использую только указатели на этот массив, поэтому, если я вызову указатель к этому массиву внутри matrix_multipl(), он, по сути, возвращается к основному, извлекает соответствующее значение из массива, что-то с ним делает (умножение матриц) и, наконец, берет вычисленное значение, снова запускается в main() и записывает результат в матрицу результатов [m][p], которая все время оставалась внутри main() и поэтому не нуждалась в «возвращении»?

Надеюсь, я правильно понял, потому что это звучит абсолютно логично и весьма полезно, потому что это предотвращает пихание больших массивов туда-сюда :)


person Wojciech Morawiec    schedule 02.01.2013    source источник
comment
Было бы легче понять, если бы вы разместили код.   -  person netcoder    schedule 03.01.2013


Ответы (3)


Я не уверен, что полностью понимаю, что вы подразумеваете под «возвратом к main()», но да, то, о чем вы, кажется, говорите, обычно называется 'передача по ссылке' и часто используется в программировании на C.

person Carl Norum    schedule 02.01.2013
comment
Под этим я подразумевал, что когда я использую указатель на first[][] внутри matrix_multipl(), массив first[][] все еще находится внутри main(), так что функция должна искать (возвращаться) значение внутри main () вместо того, чтобы иметь его там. - person Wojciech Morawiec; 03.01.2013
comment
Кажется, я понял, но я думаю, что вы путаете реализацию функции с расположением в памяти ее локальных переменных. - person Carl Norum; 03.01.2013

Он не «по сути возвращается к основному», matrix_multiply() будет обращаться к памяти, на которую указывают указатели матрицы.

И, что касается одного из других ответов и «передачи по ссылке», C всегда использует «передачу по значению» - это причина того, что вам нужно передавать указатели, а не сами матрицы (то, что на самом деле передается в matrix_multiply, будет копию указателей, которые вы определяете в main).

person Kim Hansson    schedule 02.01.2013

Ссылка на начальный адрес памяти массивов (по ссылке).

void matrix_multiply(int *array1, int *array2, int *answer) {
// matrix multiply operation.
}

соглашение:

&array[0] передается в функцию для удовлетворения параметра *array

person Community    schedule 02.01.2013
comment
Я не понимаю соглашения, которое у вас есть в конце - array и &array[0] одинаковы во многих контекстах. Конечно, **array и &array[0] не одно и то же. - person Carl Norum; 03.01.2013
comment
Кроме того, для массивов без указателей (т.е. type var[n][m]) это описание неверно. Параметры функции в этом ответе используют массивы указателей; не указатели на массивы, и есть разница. - person WhozCraig; 03.01.2013
comment
Соглашение по-прежнему неверно; &array[0] — это просто array+0, и я надеюсь, что это просто array. - person WhozCraig; 03.01.2013
comment
Оба они ссылаются на начальный адрес памяти. Я использовал это в течение многих лет и дошел до того, что мне никогда не нужно отлаживать свои программы на C. Указатели — это чрезвычайно простые концепции, из которых люди делают слишком большое дело. - person ; 03.01.2013
comment
Вы утверждаете, что int array[5] *array является адресом первого элемента этого массива? Я, вероятно, не понимаю, если это не так, потому что &array[0] == *array определенно подразумевает это. Либо это, либо, возможно, ясность в том, что &array[0] в вашем соглашении — это то, что вы передаете функции, которая имеет int *array в качестве имени параметра, если это было намерением. А что касается большого дела, я ненавижу беспорядок так же сильно, как и любой другой парень. Я предпочитаю использовать array, а не &array[0] в любой день. - person WhozCraig; 03.01.2013
comment
Я должен был просто сказать, что можно удовлетворить требование функции для указателя (в данном случае *array), вставив &array[0] . Я просто рассматриваю их обоих как просто ссылку на адрес. - person ; 03.01.2013
comment
Уменьшение беспорядка — это хорошо, но в иллюстративных целях, поскольку «&» — это обозначение адреса, я подумал, что более познавательно будет сказать, что можно просто получить адрес первого элемента. - person ; 03.01.2013
comment
@CarlNorum он имел в виду то, что сейчас в описании, что (как ни странно) я понимаю. - person WhozCraig; 03.01.2013
comment
Нет, если вы используете его как объявление параметра функции. В качестве параметра это означает просто указатель. - person ; 03.01.2013
comment
Кажется, я понимаю, к чему ты сейчас клонишь. Это недопустимый синтаксис без типа, что сбивает с толку. - person Carl Norum; 03.01.2013