Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中查找多维数组的维数_C_Arrays_Multidimensional Array - Fatal编程技术网

如何在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;
}