19

对不起这个蹩脚的标题,但我不知道如何更好地描述这个问题。

是什么意思:

int (*x)[];

以及如何初始化它?

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

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

不会编译。

先感谢您。

4

6 回答 6

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.
于 2012-04-27T12:27:30.293 回答
13

使用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
于 2012-04-27T12:23:57.097 回答
3

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

int a[2] = {1, 2};
int (*x)[2] = &a;
于 2012-04-27T12:24:44.453 回答
2

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

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

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

int *x[]

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

于 2012-04-27T12:24:54.920 回答
1

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

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

因此,当您看到:

int *x;

这意味着表达式*x的类型是intx指针指向 int 类型的变量也是。

如果你看到:

int x[5];

这意味着表达式x[3]的类型是int,因此x是数组类型的变量。

所以,要表达你的意思:

int (*x)[];

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

于 2012-04-27T12:41:35.880 回答
0

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

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

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

于 2012-04-27T12:58:04.440 回答