作者:拍友2502905977 | 来源:互联网 | 2022-12-09 18:54
我知道这个例子:
void foo(int a[])// or a[x]
将由编译器考虑如下:
void foo(int *a)
但我不知道,我没有发现编译器看到的多维数组是怎样的
例如:
void foo(int a[3][4])
它会是这样的吗?
void foo(int (*a)[4])
或者类似的东西?
void foo(int **a)
dbush..
22
当数组衰减时,它会转换为指向第一个元素的指针.在的情况下int a[3][4]
,a
是一个数组int[4]
,所以指向int [3][4]
has类型的元素的指针int (*)[4]
.
所以这:
void foo(int a[3][4])
是相同的:
void foo(int (*a)[4])
Weather Vane..
6
在不知道除最外层之外的每个维度的情况下,编译器不能索引传递给函数的多维数组.
因此,对于1D阵列,不需要长度:
void foo(int a[]);
和
void foo(int a[3]);
尽管有误导性,但它们是相同的,因为C不关注数组的长度:这是程序员正确的.
对于一个二维数组的内部尺寸也必须是正确的,或者编译器将不知道如何建立索引.所以
void foo(int a[][3]);
很好,但是
void foo(int a[][]);
无法编码,和
void foo(int a[42][3]);
是好的,但不必要,而不是限制,因为所有编译器需要的是有关如何索引的信息,而不是多少.
1> dbush..:
当数组衰减时,它会转换为指向第一个元素的指针.在的情况下int a[3][4]
,a
是一个数组int[4]
,所以指向int [3][4]
has类型的元素的指针int (*)[4]
.
所以这:
void foo(int a[3][4])
是相同的:
void foo(int (*a)[4])
2> Weather Vane..:
在不知道除最外层之外的每个维度的情况下,编译器不能索引传递给函数的多维数组.
因此,对于1D阵列,不需要长度:
void foo(int a[]);
和
void foo(int a[3]);
尽管有误导性,但它们是相同的,因为C不关注数组的长度:这是程序员正确的.
对于一个二维数组的内部尺寸也必须是正确的,或者编译器将不知道如何建立索引.所以
void foo(int a[][3]);
很好,但是
void foo(int a[][]);
无法编码,和
void foo(int a[42][3]);
是好的,但不必要,而不是限制,因为所有编译器需要的是有关如何索引的信息,而不是多少.
"C不关注数组的长度" - 这仅适用于函数参数的情况,一般情况下不适用
@Wilson必须注意实际(非函数参数)数组的大小,例如使`sizeof`运算符给出正确的大小.