2010-07-14 39 views
28

当我在一行声明多个变量时会发生什么?例如C多个单行声明

int x, y, z; 

所有是整数。问题是以下语句中的y和z是什么?

int* x, y, z; 

它们都是int指针吗?

+0

编辑的问题,因为它与Objective C无关目录C – 2010-07-14 14:17:01

+0

我知道这里有一个这个问题的重复(我以前肯定读过这个) – 2010-07-14 14:48:35

回答

59

只有x是int的指针; yz是常规整数。

这是C声明语法的一个方面,它让一些人前往。 C使用声明符的概念,该概念引入了声明的名称以及未由类型说明符提供的附加类型信息。在声明

int* x, y, z; 

的说明符*xy,并且z(那就是你可以写任何int* xint *x,而这个问题的几个原因之一,我建议使用第二种风格的C语法的事故)。的xy,和z的int岬由类型说明符int指定,而由声明符*x指定的x指针岬(IOW,表达*x具有类型int)。

如果你希望所有三个对象都是指针,你有两个选择。您可以声明为指针明确:

int *x, *y, *z; 

,或者你可以创建一个整型指针的typedef:

typedef int *iptr; 
iptr x, y, z; 

只要记住,声明指针时,该*是变量名称的一部分,而不是类型。

+1

真正的完整答案,以及*是否为类型或变量的基本问题。 – ruralcoder 2010-07-14 14:58:24

8

在你的第一句话:

int x, y, z; 

他们都是int秒。

然而,在第二个:

int* x, y, z; 

只有x是指向intyz是普通的ints。

如果你希望它们都被指向int是你需要做的:

int *x, *y, *z; 
+3

这是间距'int * foo;'的一个原因是真的被误导了。在这个问题的例子中,它看起来像3个变量都是“'int *'”类型的。我会说这个间距几乎和'a + b * c'一样令人反感。 – 2010-07-14 14:59:59

6

只有x是一个int指针。 Y和Z将会是int。 如果你想要个三分球:

int * x, * y, * z; 
3

重要的是要知道,在C中,声明模仿使用。 *一元运算符在C中是正确的关联。因此,例如在int *x中x是指向int(或int-star)的指针类型,而在int x中,x的类型为int。

正如其他人也提到的,在int* x, y, z; C编译器声明x为一个int星,y和z为整数。