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