在C ++中,以下表示“为int指针分配内存”:
int* number;
因此,星号是变量类型的一部分;没有它,这意味着“为int分配内存”。
那么,如果以下意思是“为两个int指针分配内存”,那么它会更有意义吗?
int* number1, number2;
答案 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
的指针(即*number1
为int
),number2
为int
。
间距对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 *a
和const 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;