【问题标题】:How to Find Dimension of a Multiple Dimension Array in C如何在 C 中查找多维数组的维数
【发布时间】: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


    【解决方案1】:

    数组大小/数组大小[0]

    示例:*

    #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 规范的半形式语法中没有单独的类型名在括号中产生,所以它们在产生中指定所需的括号来定义诸如 sizeofgeneric-associations、和cast-expressions。但是这些括号确实存在,以便能够解析表达式语法中的类型。它们是您可能称之为“类型表达式”的语法的一部分,但鉴于此类事物的使用有限,它们实际上并没有任何此类产生式或术语。

    【讨论】:

    • 如果您将 %d 用于 C89,您还应该使用强制转换为 int。
    • True,或者使用 %ld 并强制转换为 long。实际上,我已经进行了无数次更改以消除 64 位系统上的警告。应该提到它。
    • sizeof 的操作数周围的括号对于表达式不是必需的(在这种情况下,括号只是表达式的更多内容)。但是,如果 sizeof 运算符的操作数是类型,则它们是必需的。
    • 另外——即使使用表达式作为sizeof 的操作数,我个人也喜欢括号,从那时起我不必担心记住 sizeof 运算符的优先级。我很难记住“乘法和除法先于加法和减法”。
    • @DigitalRoss - (int) 不是表达式。 sizeof 类型操作数周围的括号要求是因为标准这样说:C99 的 6.5.3.4/2(sizeof 运算符),“sizeof 运算符产生其操作数的大小(以字节为单位),这可能是表达式或带括号的类型名称。"
    【解决方案2】:

    你为什么不给:

    sizeof(array) / sizeof(char*) / 3
    

    一枪?

    这是假设您知道数据类型 (char*) 和其他维度 (3)。

    您将结构的大小除以每个元素的大小以获得元素的总数,然后将其除以第一个维度,得到第二个。

    除此之外:我原来的答案使用了'sizeof("a")',这当然是错误的,因为它是数组的大小(2,是 'a' 和 '\0'),而不是指针(在我非常过时的 32 位机器上为 4)。但我喜欢我为那个错误的答案获得两次赞成票的方式——你们在投票前真的不在这里检查答案吗? :-)

    【讨论】:

    • 不是一个非常优雅的解决方案 - 与 DigitalRoss 的解决方案相比。您必须对编写它的类型有相当多的了解。是的,人们在投票时并不总是检查答案 - 或发现答案的问题。
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多