我需要在C中打印出一个3乘3的矩阵。我可以想出3种不同的方法。它们都是同等最优的还是比另一种更好的一种方法?
功能1:使用数组下标传递2darray
void printMatrix(int m[][3])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t",m[i][j]);
}
printf("\n");
}
}
功能2:使用ptr算法传递dbl指针
void printMatrix(int **m)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t", *(*(m+i)+j) );
}
printf("\n");
}
}
功能3:使用ptr算法传递dbl指针(再次)
void printMatrix(int **m)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d\t",**m);
(*m)++;
}
(*m)=(*m)-3;
m++;
printf("\n");
}
}
答案 0 :(得分:2)
功能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]
,即使它有所不同。
答案 1 :(得分:1)
它们在内部几乎完全相同。数组本质上是指向偏移量的指针。就个人而言,我认为第一个更容易阅读,所以我会坚持使用那个。
答案 2 :(得分:0)
没关系! : - )
真!最好的方法是你最喜欢的方法。