【问题标题】:why g++ gives error : cannot convert ‘int (*)[3]’ to ‘int (*)[]’ in initialization为什么g ++给出错误:在初始化中无法将'int(*)[3]'转换为'int(*)[]'
【发布时间】:2013-07-02 18:33:57
【问题描述】:

当我尝试使用 g++ 编译以下代码时:

int main()
{
    int a[3] = {0, 1, 2};
    int (* p)[] = &a;
}

编译器给出以下错误:“初始化时无法将‘int ()[3]’转换为‘int ()[]’”。 为什么不能将 int ()[3] 转换为 int ()[]? 如果不可能,那么应该如何初始化 'int (*)[]' 类型的变量?

【问题讨论】:

  • 我在 gcc-4 中编译了这段代码。有点奇怪。但这是合法的。试试 int (* p)[] = {&a};

标签: c++ arrays pointers


【解决方案1】:

因为您必须指定指针指向的数组的长度。 应该是这样的:

int (* p)[3] = &a;

int (*p)[] 这意味着您的p 是一个指向数组的指针。问题是编译器必须在编译时知道指针指向的数组有多长,因此您必须在括号中指定一个值 -> int (*p)[x] 其中x 在编译时已知。

【讨论】:

  • 那么就没有办法初始化int (* p)[]
  • 不,没有办法初始化它,因为这样的类型在C++中是没有意义的。
  • @CarlNorum int (*)[] 类型并非毫无意义。它是一个指向未知大小数组的指针。取消引用它会产生一个未知大小的数组类型的左值。甚至可以访问数组的元素,因为即使整个数组的大小不知道,单个元素的大小也是已知的。
  • 你是对的 - 我认为你甚至不能创建这样一个变量,但这里的快速测试证明我错了。
【解决方案2】:

有很多方法可以初始化int (*)[] 类型的变量。例如,它可以由int (*)[] 类型的其他值(包括由显式强制转换产生的值)或空指针常量来初始化。 int (*)[3] 值不会立即起作用,因为它具有不同的类型。

在你的情况下,我希望这是完全合法和明确的

 int (*p)[] = (int (*)[]) &a;

(*p)[i] 的身份进一步访问战斗。

【讨论】:

    【解决方案3】:

    你可以做你想做的事(比如使用p[0]p[1]p[2]访问每个元素):

    int *p = a;
    

    除非你真的想要一个指向指针的指针,在这种情况下使用:

    int **p = &a;
    

    【讨论】:

    • 这只是指向第一个元素的指针,而不是整个数组。
    • @HunterMcMillen:指向第一个元素的指针指向数组的指针。
    • C++ 保证数组分配是连续的,所以是的,指向头部的指针就是指向数组的指针。
    • 第二个声明完全不正确。你不能做int **p = &a&a 的类型为 int (*)[3],而不是 int **。将这样的值强制放入 int ** 变量是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 2021-12-15
    • 1970-01-01
    • 2020-07-19
    • 2016-09-21
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多