我看了C代码已经有一段时间了,但我正在努力确保我理解这里发生了什么。有人宣称这个(代码中有更多成员):
int trysizes[] = { 64, 64, 128, 64, };
然后他们将此作为for循环的一部分使用:
sizeof(trysizes)/sizeof*(trysizes)
我认为第一部分是数组中的字节数,第二部分必须是每个数组成员的大小,为我们提供数组中的项数。这是计算数组长度的标准方法吗?实际做的第二个尺寸是什么?
答案 0 :(得分:15)
是的,在修复了令人困惑的语法之后,这就变成了
sizeof(trysizes)/sizeof(*trysizes)
甚至更好
sizeof(trysizes)/sizeof(trysizes[0])
这是计算数组元素数量的首选方法。第二个sizeof
确实计算了数组元素0
的大小。
请注意,这仅在trysizes
实际上是数组时有效,而不是指向一个数组的指针。
答案 1 :(得分:1)
你明白了。分母中的第二个sizeof
取消引用数组的第一个元素,产生元素0
的大小。 sizeof
知道数组变量的总缓冲区大小 - 分子 - 因此这个习惯用法将产生数组中元素的数量。
根据我的经验,这是这种特殊习语的罕见表达,通常我已经看过,我使用:
sizeof(var)/sizeof(var[0]);
这更清楚地将变量标识为数组而不是指针。
这是一个非常常见的技巧,但请注意,只有将变量声明为数组时,它才有效。这不适用于已作为函数参数转换为指针的数组。
答案 2 :(得分:1)
关键是,当使用sizeof时,虽然我们主要使用int a; sizeof(a);
,但我们也可以省略括号,如下所示:int a; sizeof a;
所以在这种情况下,sizeof*(trysizes) == sizeof *trysizes == sizeof(*trysizes)