【问题标题】:C++ asterisk and bracket operators used togetherC++ 星号和括号运算符一起使用
【发布时间】:2012-05-08 04:35:59
【问题描述】:

抱歉标题很蹩脚,但我不知道如何更好地描述这个问题。

什么意思:

int (*x)[];

以及如何初始化它?

我知道这不是int *x[],因为:

int a,b;
int (*x)[] = {&a, &b};

不会编译。

提前谢谢你。

【问题讨论】:

    标签: c++ operators


    【解决方案1】:

    类型声明具有类似表达式的语法,因此您可以将它们解析为 你会表达:

          x       x is
         *x       a pointer
        (*x)[]    to an array of unknown dimensions
    int (*x)[]    of int
    

    优先规则是右边的运算符比 左边的那些,在每种情况下,操作符都离元素更近 绑定更紧密,最后,括号可以用来改变这些 绑定,所以:

    int  *x[];    is an array of pointers,
    int *(x[]);   as is this.
    int (*x)[];   whereas here, the parentheses change the bindings.
    

    【讨论】:

      【解决方案2】:

      使用cdecl,可以轻松判断类型:

      将 x 声明为指向 int 数组的指针

      所以你可以用数组的地址来初始化x

      int a[]; // conceptual: error if compiled
      x = &a;
      

      请注意,数组的大小是其类型的一部分,因此您不能将大小为N 的数组的地址分配给大小为M 的数组的指针,其中N!=M(这就是原因对于上面的错误:你需要知道数组的大小来声明它)

      int b[5];
      int c[6];
      int (*y)[6];
      y = &b; // error
      y = &c; // OK
      

      【讨论】:

      • 提到 cdecl 的提价 - 我忘记了它的存在 - 虽然严格来说,它只支持 C 语法。
      • 感谢链接,很有用!
      【解决方案3】:

      int (*x)[] 用于指向空 int 数组的指针。但是在 c++ 中无法初始化一个空数组。只有你可以定义它。您应该使用非空数组:

      int a[2] = {1, 2};
      int (*x)[2] = &a;
      

      【讨论】:

      • GCC 抱怨它无法将 int (*)[2] 转换为 int (*)[]。编辑:现在它偏离了问题;)
      【解决方案4】:

      int (*x)[] 表示 x 是一个指向 int 数组的指针。你可以这样做:

      int a[] = {1, 2};
      int (* b)[2] = &a;
      

      当解释数组类型的变量时,我们应该从右到左。例如

      int *x[]
      

      表示x是一个数组,数组中的元素类型为int *,即指向int的指针。 因此x 表示一个数组,其元素是 int 指针。但是,括号改变了运算符的优先级。现在*首先被解释为表示x是一个指针,它的类型是int []。因此,int (*x)[] 中的 x 是一个指向 int 数组的指针,您应该相应地对其进行初始化。

      【讨论】:

      • 不编译:错误:无法在赋值中将 'int ()[2]' 转换为 'int ()[]'
      • ideone.com - 我认为它在后面使用 gcc,但我不知道是什么版本/选项
      • 在 Visual Studio 2010 中无法编译:无法从 'int ()[2]' 转换为 'int ()[]'
      • @Chlind 不知道是不是gcc的扩展,可以根据报错修改b的定义为int (*b)[2]。更新我的答案。谢谢。
      【解决方案5】:

      我以前也遇到过 C 类型的问题,直到我知道它是如何创建的。

      在 C 中,类型是按照您使用该类型变量的方式来描述的。

      因此,当你看到:

      int *x;
      

      表示表达式*x的类型是int,所以x是指针类型的变量。

      如果你看到:

      int x[5];
      

      表示表达式x[3]的类型是int,所以x是一个整型数组的变量。

      所以,要表达你的意思:

      int (*x)[];
      

      这意味着表达式*xint[] 类型(即,一个未知大小的int 数组)。因此x 是一个指针指向数组的变量。

      【讨论】:

      • 你基本上是正确的,但你可以更清楚。当您看到int *x 时,这意味着*x一个int 类型的变量。按照你说的方式,不清楚你的意思是 *x 是 int 类型的 value 还是 int 类型的 variable
      • @EricLippert:*x 不是变量,而是表达式。我到处都引入了“表达式”和“变量”来标记区别,希望能让事情更清楚。
      • 当然*x是一个变量;它代表一个存储位置你可以给它赋值,所以它是一个变量;这就是变量的含义:您可以为其赋值的存储位置。 C 程序员当然倾向于称这些东西为“左值”而不是“变量”,这很不幸。 “左值”是一种令人困惑且不必要的术语“变量”的说法。
      【解决方案6】:

      int (*x)[ ] 这意味着 x 是一个指向 int 数组的指针 初始化为: 整数 (*x)[ ]; 诠释一个[10]; x = &a;

      int *x[ ] 这意味着 x 是指向 int 的指针数组 诠释 *x[10]; 诠释一个[10]; x[0] = a;

      在我看来,始终使用初始化数组变量或使用 int **x 而不是 *x[ ] 然后在运行时分配内存。

      【讨论】:

      • 第一个使用示例不编译:错误:无法在赋值中将'int()[10]'转换为'int()[]'
      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2016-08-09
      • 2012-10-01
      • 2017-12-05
      相关资源
      最近更新 更多