C ++星号和括号运算符一起使用

时间:2012-04-27 12:16:45

标签: c++ operators

抱歉这个糟糕的标题,但我不知道如何更好地描述这个问题。

是什么意思:

int (*x)[];

以及如何初始化它?

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

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

不会编译。

提前谢谢。

6 个答案:

答案 0 :(得分:26)

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

      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.

答案 1 :(得分:13)

使用cdecl,您可以轻松确定类型:

  

将x声明为指向int

数组的指针

因此,您可以使用数组的地址初始化x

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

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

N!=M

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

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

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

int *x[]

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

答案 4 :(得分:1)

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

在C中,类型以您使用该类型变量的方式描述。

因此,当你看到:

int *x;

这意味着表达式*x的类型为int,因此x是指向int类型的变量。

如果你看到:

int x[5];

这意味着表达式x[3]的类型为int,因此x是array-of-int类型的变量。

所以,要表达你的意思:

int (*x)[];

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

答案 5 :(得分:0)

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

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

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