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
".它是"数组类型 "?不,这是一个指针.是"功能返回型 "吗?不,这是一个指针.因此它没有得到调整.