我正在研究C中的最后一个明天,并且对于运算符sizeof有个问题。sizeof数组澄清
比方说,int
的大小是32
位,指针是64
位。
如果有一个功能:
int
foo (int zap[])
{
int a = sizeof(zap);
return a;
}
因为zap
是一个指针,foo
将返回8
,因为这是多少个字节如何需要存储这个特殊的指针。然而,用下面的代码:
int zip[] = { 0, 1, 2, 3, 4, 5 };
int i = sizeof(zip);
i
将6 * sizeof(int)
= 6 * 4
= 24
为什么是它的每个元素的元素的sizeof(zip)
返回数倍大小,而sizeof(zap)
返回a的大小指针?是不是zap
的大小不明确,zip
不是?编译器知道zip
是6
元素,但不知道可能有多大。
数量并不被编译器忽略,INT X [4]作为函数参数意味着你必须通过的_exactly_ 4个元素的数组的指针。这与在代码中其他地方写入'int(* x)[4]'是一样的。除此之外,这个答案指出了这个问题:参数的数组语法与程序中其他地方声明的数组具有不同的含义。它是C语言的“特征”之一。为避免混淆,请始终使用“int * x”表示法来表示参数。 – Lundin 2011-05-09 06:56:59
您可以指出它在标准中写入括号内的数字必须等于传递数组的大小吗?提示:考虑到你根本不能传递一个数组并且该函数实际上只接收一个指针,这将是一个奇怪的要求。当调用用'FOO的函数(巴)'其中'bar'是一个数组,数组已被转换为指针**即使对于编译器**被认为是函数调用之前。对转换中已经放弃的尺寸信息施加限制是没有意义的。 – 6502 2011-05-09 07:06:29
@Lundin,对于数组参数的第一维,no基本上被忽略。此外,C99还有关键字'static'的可能性,以指定该函数对于项目至少*。但参数的类型仍然是'int *'。 – 2011-05-09 07:51:45