"int(*)[]"在函数参数中是否会衰减为"int**"?

wef*_*fa3 15 c arrays pointers function language-lawyer

我今天早些时候在programmers.stackexchange上发布了这个问题.我一直认为int (*)[]不会衰减到int **函数参数中,但我得到了多个回答我的问题表明它确实存在.

int (*)[]在我的函数参数中使用了很多,但现在我变得非常困惑.

当我使用编译此函数时 gcc -std=c99 -pedantic -Wall

void function(int (*a)[])
{
    sizeof(*a);
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

c99 -Wall -pedantic -c main.c -o main.o
main.c: In function ‘function’:
main.c:3:11: error: invalid application of ‘sizeof’ to incomplete type ‘int[]’ 
make: *** [main.o] Error 1
Run Code Online (Sandbox Code Playgroud)

这表明*a有类型int []而不是int *.

有人可以解释一下,如果在函数参数中int (*)[]衰减int **,并给我一些参考(可能来自标准文档),这证明了为什么会这样.

hac*_*cks 18

传递给函数时,只有数组类型转换为指向其第一个元素的指针.a指向数组int的类型指针,即它是指针类型,因此没有转换.

对于原型

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

编译器将其解释为

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

那是因为a[]是数组类型.int a[][10]绝不会转换为int **a.也就是说,答案中的第二段是错误的和误导性的.

作为函数参数,int *a[]相当于int **这是因为a数组类型.


nul*_*ptr 7

int (*)[]是一个指向数组的指针int.

在你的例子中,*a 可以腐烂int*.但sizeof(*a)不会腐烂; 它本质sizeof(int[])上是无效的.

a 根本不能腐烂(它是一个指针).


T.C*_*.C. 7

N1256§6.7.5.3/ p7-8

7一个参数为""的阵列的声明类型 "",应调整至""合格指针 键入 "",其中类型限定符(如果有的话)的那些内的指定[]该阵列类型的推导.如果关键字 static也出现在数组类型派生的[]中,那么对于每次对函数的调用,相应的实际参数的值应该提供对数组的第一个元素的访问,其中至少有与该大小指定的元素一样多的元素.表达.

8参数声明为''函数返回类型 ''应调整为''函数返回类型的指针'',如6.3.2.1所述.

int (*)[]是"指向数组的指针int".它是"数组类型 "?不,这是一个指针.是"功能返回 "吗?不,这是一个指针.因此它没有得到调整.