【发布时间】:2020-05-31 03:05:19
【问题描述】:
我开始学习C,并开始了一个新的论点:the matrices。
我看到你可以用两种不同的方式定义一个矩阵
方式 1
第一种使用下标运算符[]
const int N = 3, M = 4;
int matrix[N][M];
但是因为这样在函数中传递参数是困难的,因为
编译器在编译程序时必须知道矩阵的列数。所以你必须做一个只适用于具有n 列的矩阵的函数
int my_func( int matrix[][3], const int num_lines){...}
方式 2
第二种方式:使用数组数组
const int N = 3, M = 4;
int** m = (int**) calloc(N, sizeof(int*))
for (int i = 0; i < N; i++){
m[i] = (int*) calloc(M, sizeof(int))
}
这样做,您可以轻松地将矩阵指针传递给函数并流畅地使用它,但唯一的问题是内存分配的效率和 价值观的回忆。
方式 3?
其实我认为可以有第三种方法,我想知道这样做是否正确
const int N = 3, M = 4;
int array[N*M];
for (int i=0; i<N; i++){
for (int j = 0; j<M; j++){
printf("%d%d: %d\n", i, j, array[ i * M + j ]);
}
}
按照我的观点,这样做应该与我编写的第一种方式一样有效,但是您可以在函数中更流畅地使用它,因为您只需将行和列作为参数传递
int my_func( const int* matrix, const int num_lines, const int num_columns){...}
way 3 对吗?
【问题讨论】:
-
是的;事实上,行和列可以是数组的
struct的一部分,那么您只需传递一个值。 -
那么我说第三种方式是“最好”的方式是否正确? @尼尔
-
这取决于您使用它的目的。三者中,它是最抽象的。
-
方式 1 和 3,正如您编写的那样,只能保证在
C99、C89中定义,您只能使用 integer constants 和C11制作可变大小的数组 @987654322 @. -
Viz,如果将
const int替换为#define,那么他们将适用于所有版本的C。