【发布时间】:2026-01-22 20:30:01
【问题描述】:
我听过很多人说,当我们想将一维数组传递给函数fun 时,以下原型是等价的:
1.
int fun(int a[]);
int fun(int a[10]);
int fun(int *a);
我什至听说有人说第一个和第二个在 C 中内部转换为第三个。我猜这是真的,因为在 2 中声明的函数的定义中像 sizeof(a) 那样做会给出大小以字节为单位的指针(而不是 10*sizeof(int))。
话虽如此,我已经看到文本声称将二维数组传递给函数,以下是等效的:
1.
int fun(int a[][10]);
int fun(int (*a)[10]);
在这里,我再次听到人们说在 C 中,第一个在内部转换为第二个。如果是真的,下面应该是等价的吧?
1.
int fun(int a[][]);
int fun(int (*a)[]);
但不幸的是,第一个提出了编译错误,但第二个没有:
1 | int fun(int a[][]);
| ^
t.c:2:13: note: declaration of ‘a’ as multidimensional array must have bounds for all dimensions except the first
这让我觉得C首先将a视为一个多维数组,每个元素都是一个整数数组,但它们的类型不完整(即int[])。
而在第二个中,a 只是一个指向整数数组的指针(未指定大小或类型不完整)。而且两者确实不同,一种格式不等同于另一种……
谁能详细指导我在每种情况下 C 中实际发生的情况?
【问题讨论】:
-
int fun(int (*a)[]);编译让我感到惊讶