类型声明 - 指针星号位置

时间:2010-04-24 10:56:34

标签: c++ pointers

在C ++中,以下表示“为int指针分配内存”:

int* number;

因此,星号是变量类型的一部分;没有它,这意味着“为int分配内存”。

那么,如果以下意思是“为两个int指针分配内存”,那么它会更有意义吗?

int* number1, number2;

5 个答案:

答案 0 :(得分:59)

Stroustrup被问到这个,他说(释义)

  
      
  • 如果您认为更多C-ish,您会说 int * a 员工* pE   (所以在你脑海里,你在想“ a 的内容是一个整数”)
  •   
  • 如果你想更多的C ++ - 你会说 int * a 员工* pE   (所以在你的头脑中它是“ a 是一个整数指针”)
  •   
     

你可以想想,只要你从不宣布两个   指针在同一条线上。

适合我。我是一个Employee* pE类型的人,但我嫁给了一个Employee *pE类型的人 - 我的建议是不要过于努力。

答案 1 :(得分:22)

实际上星号附加到变量(从C继承的约定),所以

int * number1, number2;

number1声明为int的指针(即*number1int),number2int

间距对number的输入方式没有影响。它只是一个令牌分隔符。以下所有内容与编译器相同,因为解析后将删除空格。

int *a;
int*a;
int* a;
int * a;
int/**a***/*/*a***/a;

使用

int* number1, *number2;

创建两个指针,甚至更好,将其拆分为多个声明以避免混淆。

int* number1;
int* number2;

答案 2 :(得分:18)

你过分简化了C ++声明的结构(尽管你所提出的观点完全符合逻辑)。只有在第一眼看来,C ++声明似乎包含类型名称和逗号分隔的实体名称序列,但实际上在C ++(以及C)中,声明实际上由类型名称和声明符序列组成< / em>的。您声明的实体的完整类型信息在两个不同位置之间分配,其中部分实际上是其声明符的一部分。这就是它在C ++中的方式。为了更好地反映声明的实际结构(如语言所示),将声明格式化为

可能是个好主意。
int *a, *b;

即。显式地将*与实体名称分组,而不是使用类型名称。 (但最终这是个人偏好的问题。)

至于为什么它在语言中以那种方式设计,正如你在其中一条评论中提出的那样......如你所知,描述所声明实体类型的声明语法部分可以出现在名称的左侧(如*&)以及右侧(如()[]),如

int *f(), (&g)[5], h[2][2];

对于出现在右边的位,根本不可能以任何其他方式进行。他们别无选择,只能与实体名称分组,而不是与类型名称分组。有人可能会进一步询问为什么上述声明不是用C ++完成的

int *() f;
int (&)[5] g;
int [2][2] h;

(即所有类型相关的内容都出现在紧凑组的左侧)......好吧,这个问题的答案就是它在C ++中的方式。该方法继承自C,并且“声明必须类似于使用”通常被引用作为基本原理。

P.S。要记住的另一件事(以及经常被错误解释的)是声明中与类型名称相邻的限定符是公共类型的一部分,而不是第一个单独声明符的一部分。例如

int const *a, *b;

声明const int *aconst int *b,而不是int *b,因为有些人可能会误认为。出于这个原因,我个人更喜欢使用更合乎逻辑的

const int *a, *b;

排序(尽管我同时希望将*与名称分组,而不是与类型分组。

答案 3 :(得分:8)

这只是C声明语法的许多不规范之一。类型修饰符*是类型的一部分,但在语法上它属于声明的标识符。
对于&[],BTW也是如此。

请参阅here了解*除了修改类型之外的其他内容。

答案 4 :(得分:3)

不,

int* number1, number2;

number1声明为int的指针,将number2声明为int。就我个人而言,我也更喜欢将星号附加到类型中,这类似于你在这个问题中提出的问题,所以我会按如下方式声明两个指针:

int* number1;
int* number2;