当函数原型有一个声明为 int a[][10] 的参数时,编译器会将其视为 int (*a)[10] 吗?

Abh*_*osh 5 c arrays

我听到很多人说,当我们想要将一维数组传递给函数时,fun以下原型是等效的:

\n

1.

\n
   int fun(int a[]);\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. \n
\n
   int fun(int a[10]);\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. \n
\n
   int fun(int *a);\n
Run Code Online (Sandbox Code Playgroud)\n

我什至听到人们说第一个和第二个在 C 中内部转换为第三个。我猜这是真的,因为sizeof(a)在 2 中声明的函数的定义中执行某些操作会给出指针的大小(以字节为单位)(而不是 10*sizeof(int))。

\n

话虽这么说,我已经看到一些文本声称将 2D 数组传递给函数,以下内容是等效的:

\n

1.

\n
int fun(int a[][10]);\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. \n
\n
int fun(int (*a)[10]);\n
Run Code Online (Sandbox Code Playgroud)\n

在这里我再次听到人们说在 C 中第一个在内部转换为第二个。如果这是真的,那么下面的内容应该是等价的,对吗?

\n

1.

\n
int fun(int a[][]);\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. \n
\n
int fun(int (*a)[]);\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

这让我觉得Ca首先将其视为一个多维数组,其中每个元素都是整数数组,但它们的类型不完整(即int[])。

\n

而在第二个中,a只是一个指向整数数组的指针(未指定大小或类型不完整)。两者确实不同,一种格式并不等同于另一种......

\n

谁能详细指导我在每种情况下 C 中实际发生的情况?

\n

Eri*_*hil 7

首先,声明规则规定数组的元素类型必须完整,根据 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。)