【问题标题】:How can you cast a 2 dimensional array in C?如何在 C 中转换二维数组?
【发布时间】:2011-06-10 07:32:10
【问题描述】:

我的大脑最近变得很模糊,我一生都记不起为什么下面的 C 代码:

char a[3][3] = { "123", "456", "789" };
char **b = a;

生成以下警告:

warning: initialization from incompatible pointer type

谁能帮我解释一下。

谢谢。

【问题讨论】:

  • 请注意,您的声明中的“123”不再是字符串,因为您截断了 \0。 “123”作为字符串包含 4 个字符,而不是 3 个。

标签: c arrays pointers initialization


【解决方案1】:
char (*b)[3] = a;

这将 b 声明为指向大小为 3 的 char 数组的指针。请注意,这与 char *b[3] 不同,后者将 b 声明为 3 个 char 指针的数组。

还要注意char *b = a 是错误的,仍然会发出与char **b = a 相同的警告。

【讨论】:

    【解决方案2】:

    试试这个,

       char a[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9' }};
       char *b = &a[0][0];
    

    因为,a 是数组的字符数组,您需要将它们初始化为字符。

    【讨论】:

      【解决方案3】:

      问题是**不是静态分配的。

      您可以通过以下方式完成这个简单的版本:

      char a[3][3] = {"123", "456", "789"};
      char *b[3] = {a[0], a[1], a[2]};
      

      【讨论】:

        【解决方案4】:

        没错。 a 是一个指针。

        char *b 定义了一个指向 char 的指针。

        char **b 定义了一个指向 char 的指针。

        【讨论】:

        • a 不是指针; a 是一个数组。说a 是指针的不合格声明是不正确的。
        【解决方案5】:

        a 仍然是一个指向字符的指针:

        char* b = a;
        

        【讨论】:

        • 是的,就是这样。对我来说编码显然太晚了。
        • 这是不正确的。 a 衰减为指向其第一个元素的指针; a 是 char[3] 的数组;指向其第一个元素的指针的类型为 char (*)[3] 而不是 char*。此指针初始化生成与原始代码完全相同的不兼容指针类型警告。
        猜你喜欢
        • 2016-09-24
        • 2021-03-11
        • 2012-03-08
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        相关资源
        最近更新 更多