数组引用方法的比较

时间:2010-09-10 19:25:35

标签: c arrays pointers

我需要在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");
 }
}

3 个答案:

答案 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)

没关系! : - )

真!最好的方法是你最喜欢的方法。