【发布时间】:2015-03-08 20:06:21
【问题描述】:
我今天早些时候在programmers.stackexchange 上发布了这个question。我一直认为int (*)[] 确实不会在函数参数中衰减为int **,但我收到的多个回答表明它确实如此。
我在函数参数中大量使用了int (*)[],但现在我变得非常困惑。
当我使用gcc -std=c99 -pedantic -Wall编译这个函数时
void function(int (*a)[])
{
sizeof(*a);
}
我收到此错误消息:
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
这表明*a 的类型为int [] 而不是int *。
谁能解释一下int (*)[]之类的东西是否会在函数参数中衰减为int **,并给我一些参考(也许来自标准文档)来证明为什么会这样。
【问题讨论】:
-
我不这么认为,但我不确定。
-
没有。只有数组和函数会衰减。指针不会衰减。
-
当然
int (*)[]没有得到调整。它既不是数组类型也不是函数类型。 -
@KerrekSB:这是 C,而不是 C++,也许它们在这里有所不同。
g++不接受我上次评论的 TU,说类型不兼容。 FWIW,我上次的评论不正确。指向不完整类型的指针始终是完整类型(在 C 中)。但尽管如此,int (*)[]和int (*)[42]在 C 中是兼容的。(顺便说一句,我所知道的指向不完整数组类型的指针的唯一问题是*a[0]无效,而**a很好。) -
@jamesqf:
int (*a)[]表示a是指向int数组的指针,而int *a[]表示a是指向int的指针数组.
标签: c arrays function pointers language-lawyer