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是数组类型.
int (*)[]是一个指向数组的指针int.
在你的例子中,*a 可以腐烂int*.但sizeof(*a)不会腐烂; 它本质sizeof(int[])上是无效的.
a 根本不能腐烂(它是一个指针).
N1256§6.7.5.3/ p7-8
7一个参数为""的阵列的声明类型 "",应调整至""合格指针 键入 "",其中类型限定符(如果有的话)的那些内的指定
[和]该阵列类型的推导.如果关键字static也出现在数组类型派生的[和]中,那么对于每次对函数的调用,相应的实际参数的值应该提供对数组的第一个元素的访问,其中至少有与该大小指定的元素一样多的元素.表达.8参数声明为''函数返回类型 ''应调整为''函数返回类型的指针'',如6.3.2.1所述.
int (*)[]是"指向数组的指针int".它是"数组类型 "?不,这是一个指针.是"功能返回型 "吗?不,这是一个指针.因此它没有得到调整.