Функция 1 работает с типом данных, отличным от функций 2 и 3.
Для функции 1 данные должны быть определены как int foo[3][3]
или выделены как блок из 9 дюймов. С C89 вторая 3
должна быть константой времени компиляции, что может быть проблематично. Это можно обойти, передав простое int *
и индексирование с использованием matrix[i * dim2 + j]
. Если у вас есть C99, вы можете использовать массивы переменной длины и переменно измененные типы, чтобы сохранить хорошую нотацию matrix[i][j]
, но объявления могут быть немного более сложными и с некоторыми ограничениями.
Функции 2 и 3 работают с несколькими частями данных: массивом целочисленных указателей, которые указывают на дополнительные массивы целых чисел. Дополнительная косвенность может позволить некоторую простоту использования и гибкость (например, треугольную матрицу), но может снизить производительность.
Выбор между функцией 2 и функцией 3 для меня довольно ясен: используйте функцию 2. Следует избегать изменения структуры данных для операции, предназначенной только для чтения, если это возможно, даже если вы вернете ее так, как было : он предотвращает одновременное использование, и вы можете неправильно выполнить часть «положить его обратно», что затруднит диагностику проблем. Выражение *(*(m+i)+j)
можно изменить на m[i][j]
, даже если оно делает что-то другое.