多维数组的衰减作为函数参数

Leo*_*sky 16 c multidimensional-array

我知道这个例子:

void foo(int a[])// or a[x]
Run Code Online (Sandbox Code Playgroud)

将由编译器考虑如下:

void foo(int *a)
Run Code Online (Sandbox Code Playgroud)

但我不知道,我没有发现编译器看到的多维数组是怎样的

例如:

void foo(int a[3][4])
Run Code Online (Sandbox Code Playgroud)

它会是这样的吗?

void foo(int (*a)[4])
Run Code Online (Sandbox Code Playgroud)

或者类似的东西?

void foo(int **a)
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 22

当数组衰减时,它会转换为指向第一个元素的指针.在的情况下int a[3][4],a是一个数组int[4],所以指向int [3][4]has类型的元素的指针int (*)[4].

所以这:

void foo(int a[3][4])
Run Code Online (Sandbox Code Playgroud)

是相同的:

void foo(int (*a)[4])
Run Code Online (Sandbox Code Playgroud)


Wea*_*ane 6

在不知道除最外层之外的每个维度的情况下,编译器不能索引传递给函数的多维数组.

因此,对于1D阵列,不需要长度:

void foo(int a[]);
Run Code Online (Sandbox Code Playgroud)

void foo(int a[3]);
Run Code Online (Sandbox Code Playgroud)

尽管有误导性,但它们是相同的,因为C不关注数组的长度:这是程序员正确的.

对于一个二维数组的内部尺寸必须是正确的,或者编译器将不知道如何建立索引.所以

void foo(int a[][3]);
Run Code Online (Sandbox Code Playgroud)

很好,但是

void foo(int a[][]);
Run Code Online (Sandbox Code Playgroud)

无法编码,和

void foo(int a[42][3]);
Run Code Online (Sandbox Code Playgroud)

是好的,但不必要,而不是限制,因为所有编译器需要的是有关如何索引的信息,而不是多少.

  • "C不关注数组的长度" - 这仅适用于函数参数的情况,一般情况下不适用 (2认同)
  • @Wilson必须注意实际(非函数参数)数组的大小,例如使`sizeof`运算符给出正确的大小. (2认同)