如何在C中查找多维数组的维数
我声明了一个二维数组,如下所示:如何在C中查找多维数组的维数,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我声明了一个二维数组,如下所示: char *array[][3] = { {"a", "b", "c"}, {"d", "e", "f"}, {"u", "v", "w"}, {"x", "y", "z"}}; 如何找到第一个维度?为什么不给出: sizeof(array) / sizeof(char*) / 3 一枪 这是假设您知道数据类型(char*)和其他维度(3) 将结构的大小除以每个元素的大小,得到元素的总数,然后除以第一个维度,得到第二个维度 旁
char *array[][3] = {
{"a", "b", "c"},
{"d", "e", "f"},
{"u", "v", "w"},
{"x", "y", "z"}};
如何找到第一个维度?为什么不给出:
sizeof(array) / sizeof(char*) / 3
一枪
这是假设您知道数据类型(char*)和其他维度(3)
将结构的大小除以每个元素的大小,得到元素的总数,然后除以第一个维度,得到第二个维度
旁白:我最初的回答使用了'sizeof(“a”)”
,这当然是错误的,因为它是数组的大小(2,是'a'和'\0'),而不是指针(在我过时得可怕的32位机器上是4)。但我喜欢我在那个错误答案上获得两张赞成票的方式——你们董事会在投票前不是在这里检查答案吗?:-) sizeof数组/sizeof数组[0]
例如:*
#包括
内部主(空){
int数组[4];
printf(“%zd\n”,sizeof数组/sizeof数组[0]);
printf(“%zd\n”,sizeof(int));
printf(“%ld\n”,长)(sizeof数组/sizeof数组[0]);
返回0;
}
*如果操作数是
类型名
,则需要参数,即使sizeof
是运算符而不是函数。但是在C语法中出现类型名的每个地方(声明程序不使用该结果),都需要使用paren。由于在用于各种C规范的半形式语法中没有单独的类型名生成项,因此它们在生成项中指定了所需的类型名,这些生成项定义了sizeof
,泛型关联
,以及强制表达式
。但是这些参数确实存在,以便能够在表达式语法中解析类型。它们是您可能称之为“类型表达式”的语法的一部分,但由于这些东西的使用有限,它们实际上没有任何这样的结果或术语。如果您对C89使用%d,您还应该使用转换为int.True,或者使用%ld和转换为long。事实上,我已经做了无数次更改,在64位系统上压制警告。应该提到它。sizeof
的操作数周围的paren对于表达式是不必要的(在这种情况下,paren只是表达式的更多部分)。但是,如果sizeof运算符的操作数是一个类型,则它们是必需的。此外,即使使用表达式作为sizeof
的操作数,我个人也喜欢parens,因为从那时起,我不必担心记住sizeof运算符的优先级。我很难记住“乘法和除法先于加法和减法”。@DigitalRoss-(int)不是一个表达式。对类型操作数的parens要求是sizeof
,因为标准是这样说的:C99(sizeof运算符)的6.5.3.4/2,“sizeof运算符产生其操作数的大小(以字节为单位),可能是表达式或类型的括号名称。”与DigitalRoss的解决方案相比,这不是一个非常优雅的解决方案。你必须对写作的类型有相当多的了解。是的,人们在投票时并不总是检查答案,也没有发现答案的问题。
#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;
}