抱歉这个糟糕的标题,但我不知道如何更好地描述这个问题。
是什么意思:
int (*x)[];
以及如何初始化它?
我知道它不是int *x[]
,因为:
int a,b;
int (*x)[] = {&a, &b};
不会编译。
提前谢谢。
答案 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 []然后在运行时分配内存。