8

我是 C 语言新手,所以我的问题可能不符合高标准

我们可以使用

struct mat{

  int a[10];

};m[10];

代替

int mat[10][10];

有什么不同?哪个更有效?

4

3 回答 3

2

您将拥有m[x].a[y]比语法更复杂的语法,m[x][y]但不会在词法上添加任何内容

于 2013-10-20T18:08:53.047 回答
1

不,这是一个包含数组的结构。

struct mat
{
  int a[10];
};

您可以定义一个结构数组:

struct mat m[10];

一步完成:

struct mat{

  int a[10];

}m[10];

请注意,在 m[10] 之前有一个额外的分号,这是不正确的语法。

要访问 arr 中的元素,请使用m[i].a[j]

这在语法上不等同于二维数组,例如:

int mat[10][10];

您可以使用mat[i][j]

于 2013-10-20T18:09:37.270 回答
1

你应该相信编译器。但是,我可能会建议 2 个我知道效果很好的替代方案,具体取决于您的应用程序。

1)使用 int a[10][10] 但确保在循环时以正确的顺序访问它们。编译器将“在下面”使用单个数组结构,以便按顺序访问

  for( i = 0 ; i < 10 ; i++) {
     for (j = 0 ; j < 10 ; j++) {
         // do something with a[i][j]
     }
  }

对比

  for( i = 0 ; i < 10 ; i++) {
     for (j = 0 ; j < 10 ; j++) {
         // do something with a[j][i]
     }
  }

在性能上是不同的。后者的性能更高。

2) 选项 1 需要格外小心且违反直觉。我更喜欢做

   int a[100]

   for( i = 0 ; i < 100 ; i++)
      inline_function(a[i]);

该函数应在其中声明为内联并执行您必须完成的事情。如果您可以避免该功能,那就更好了。例如,如果它是一个总和,让它 2d 或向量不会改变任何东西。

编辑:这是一个参考,详细解释了有关数组顺序的位:http ://www.cplusplus.com/doc/tutorial/arrays/

于 2013-10-20T18:16:08.183 回答