我听到很多人说,当我们想要将一维数组传递给函数时,fun以下原型是等效的:
1.
\n int fun(int a[]);\nRun Code Online (Sandbox Code Playgroud)\n int fun(int a[10]);\nRun Code Online (Sandbox Code Playgroud)\n int fun(int *a);\nRun Code Online (Sandbox Code Playgroud)\n我什至听到人们说第一个和第二个在 C 中内部转换为第三个。我猜这是真的,因为sizeof(a)在 2 中声明的函数的定义中执行某些操作会给出指针的大小(以字节为单位)(而不是 10*sizeof(int))。
话虽这么说,我已经看到一些文本声称将 2D 数组传递给函数,以下内容是等效的:
\n1.
\nint fun(int a[][10]);\nRun Code Online (Sandbox Code Playgroud)\nint fun(int (*a)[10]);\nRun Code Online (Sandbox Code Playgroud)\n在这里我再次听到人们说在 C 中第一个在内部转换为第二个。如果这是真的,那么下面的内容应该是等价的,对吗?
\n1.
\nint fun(int a[][]);\nRun Code Online (Sandbox Code Playgroud)\nint fun(int (*a)[]);\nRun Code Online (Sandbox Code Playgroud)\n但不幸的是,第一个提出了编译错误,但第二个没有:
\n 1 | int fun(int a[][]);\n | ^\nt.c:2:13: note: declaration of \xe2\x80\x98a\xe2\x80\x99 as multidimensional array must have bounds for all dimensions except the first\nRun Code Online (Sandbox Code Playgroud)\n这让我觉得Ca首先将其视为一个多维数组,其中每个元素都是整数数组,但它们的类型不完整(即int[])。
而在第二个中,a只是一个指向整数数组的指针(未指定大小或类型不完整)。两者确实不同,一种格式并不等同于另一种......
谁能详细指导我在每种情况下 C 中实际发生的情况?
\n首先,声明规则规定数组的元素类型必须完整,根据 C 2018 6.7.6.2 1。因此int a[][]会出现编译器错误,因为第一个[]指定的数组的元素为int [],这是不完整的。
分析声明后,将函数参数声明为数组的声明调整为指针,按照 C 2018 6.7.6.3 7。
int (*a)[]允许且不会出现错误,因为没有规定指针必须指向完整类型。(如果对指针执行算术运算,则指向的类型必须是完整的,根据 C 2018 6.5.6 2 和 3。)
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |