我声明了一个二维数组:
char *array[][3] = {
{"a", "b", "c"},
{"d", "e", "f"},
{"u", "v", "w"},
{"x", "y", "z"}};
我该如何找到第一个维度?
我声明了一个二维数组:
char *array[][3] = {
{"a", "b", "c"},
{"d", "e", "f"},
{"u", "v", "w"},
{"x", "y", "z"}};
我该如何找到第一个维度?
示例:*
#include <stdio.h>
int main(void) {
int array[4];
printf("%zd\n", sizeof array / sizeof array[0]);
printf("%zd\n", sizeof (int));
printf("%ld\n", (long)(sizeof array / sizeof array[0]));
return 0;
}
type-name
,即使sizeof
是运算符而不是函数,你仍需要括号。但在C语法中出现type-name
的每个地方(声明符不使用该产生式),都需要在其周围加上括号。由于在用于各种C规范的半正式语法中没有单独的类型名括在括号中的产生式,因此它们在定义sizeof
、generic-associations
和cast-expressions
等事物的产生式中指定了所需的括号。但这些括号实际上是为了能够解析表达式语法中的类型而存在的。它们是“类型表达式”的一部分语法,但由于这些东西的有限使用,它们实际上没有任何这样的产生式或术语。sizeof(array) / sizeof(char*) / 3
一次调用?
假设你知道数据类型(char*)和其他维度(3),你需要将结构体的大小除以每个元素的大小以得到总元素数,然后再除以第一个维度,从而得到第二个维度。
另外:我的原始答案使用了'sizeof("a")'
,当然是错误的,因为它是数组的大小(2,即'a'和'\0'),而不是指针的大小(在我那可怕过时的32位机器上为4)。但我喜欢我得到那个错误答案的两个赞 - 你们这些家伙在投票前真的不检查答案吗? :-)
sizeof
运算符的操作数是表达式,那么在操作数周围加上括号是没有必要的(这种情况下的括号只是表达式中的一部分)。但是,如果sizeof
运算符的操作数是一个类型,则需要使用括号。 - Michael Burrsizeof
操作数时,我个人喜欢加上括号,这样我就不必担心记住sizeof
运算符的优先级。我很难记住除法和乘法比加法和减法先执行这一点以上的内容。 - Michael Burrsizeof
的类型操作数周围需要使用括号的要求是因为标准这样规定:C99 的 6.5.3.4/2(sizeof 运算符),“sizeof 运算符产生其操作数的大小(以字节为单位),其可以是一个表达式或一个用括号括起来的类型名称。” - Michael Burr