2012-04-27 44 views
18

对不起,这个蹩脚的标题,但我不知道如何更好地描述这个问题。C++星号和括号一起使用的操作符

是什么意思:

int (*x)[]; 

以及如何初始化呢?

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

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

将无法​​编译。

预先感谢您。

回答

25

类型声明有一个表达式的语法,所以你解析他们的 你将一个表达式:

 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

+1 ....太棒了! – Nawaz 2012-04-28 05:11:33

13

使用cdecl,你可以很容易地确定类型:

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

请注意,数组的大小的一部分:

declare x as pointer to array of int

所以,你可以用数组的地址初始化x它的类型,所以你不能将大小为N的数组的地址分配给指向大小为M的数组的指针,其中N!=M(这是上述错误的原因:您需要知道数组的大小使用的指针空int数组声明它)

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

提醒'cdecl' - 我忘记它存在 - 尽管严格地说,它只支持C语法。 – 2012-04-27 12:43:00

+0

感谢您的链接,它很有用! – Chlind 2012-04-27 13:53:50

3

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

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

GCC抱怨它无法将int(*)[2]'转换为int(*)[]'。编辑:现在它偏离的问题;) – chris 2012-04-27 12:25:32

+0

你是对的,我纠正它。 – 2012-04-27 12:27:44

2

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数组的指针,你应该相应地初始化它。

+0

无法编译:错误:无法在作业 – Attila 2012-04-27 12:31:08

+0

@Attila中将'int(*)[2]'转换为'int(*)[]'你的编译器是什么,在gcc 4.1.2'上正常工作。:) – 2012-04-27 12:32:08

+0

http :// ideone。com/- 我认为它在后面使用gcc,但我不知道什么版本/选项 – Attila 2012-04-27 12:33:54

1

我曾经有C打字问题,直到我学会了如何创建。

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

因此,当看到:

int *x; 

这意味着表达*xint类型,因此x是类型指针到整型变量。

如果你看到:

int x[5]; 

这意味着表达x[3]int类型,因此x是类型阵列的-INT的变量。

所以,去你的表达:

int (*x)[]; 

这意味着表达*xint[]型的(即,未知大小的int数组)。因此x是一个类型为pointer-to-an-array-of-int的变量。

+1

你基本上是正确的,但你可能会更清楚。当你看到'int * x'这意味着'* x'是一个int类型的变量*。你说的这种方式,目前还不清楚你的意思是'* x'是int型的*值*还是int型的*变量*。 – 2012-04-27 17:14:53

+0

@EricLippert:'* x'不是一个变量,它是一个表达式。我在整个地方引入了“表达”和“变量”来标记区别,并希望更清晰。 – 2012-04-28 10:27:08

+2

当然'* x'是*变量*;它代表一个*存储位置*,您可以将值赋给*,所以它是*变量*;这就是变量*的含义*:您可以为其指定值的存储位置。 C程序员当然倾向于称这种“左值”而不是“变量”,这是不幸的; “左值”是混淆和不必要的混乱的方式来说“变量”。 – 2012-04-28 15:03:21

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 [],然后在运行时分配内存。

+0

第一个使用示例不会编译:错误:无法在分配中将'int()[10]'转换为'int()[]' – Attila 2012-04-27 13:48:44