【发布时间】:2009-09-18 19:07:23
【问题描述】:
我声明了一个这样的二维数组:
char *array[][3] = {
{"a", "b", "c"},
{"d", "e", "f"},
{"u", "v", "w"},
{"x", "y", "z"}};
如何找出第一个维度?
【问题讨论】:
标签: c arrays multidimensional-array
我声明了一个这样的二维数组:
char *array[][3] = {
{"a", "b", "c"},
{"d", "e", "f"},
{"u", "v", "w"},
{"x", "y", "z"}};
如何找出第一个维度?
【问题讨论】:
标签: c arrays multidimensional-array
示例:*
#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 的操作数周围的括号对于表达式不是必需的(在这种情况下,括号只是表达式的更多内容)。但是,如果 sizeof 运算符的操作数是类型,则它们是必需的。
sizeof 的操作数,我个人也喜欢括号,从那时起我不必担心记住 sizeof 运算符的优先级。我很难记住“乘法和除法先于加法和减法”。
sizeof 类型操作数周围的括号要求是因为标准这样说:C99 的 6.5.3.4/2(sizeof 运算符),“sizeof 运算符产生其操作数的大小(以字节为单位),这可能是表达式或带括号的类型名称。"
你为什么不给:
sizeof(array) / sizeof(char*) / 3
一枪?
这是假设您知道数据类型 (char*) 和其他维度 (3)。
您将结构的大小除以每个元素的大小以获得元素的总数,然后将其除以第一个维度,得到第二个。
除此之外:我原来的答案使用了'sizeof("a")',这当然是错误的,因为它是数组的大小(2,是 'a' 和 '\0'),而不是指针(在我非常过时的 32 位机器上为 4)。但我喜欢我为那个错误的答案获得两次赞成票的方式——你们在投票前真的不在这里检查答案吗? :-)
【讨论】: