在C++中,int *x和int* x有什么区别吗?

18

我正在重新学习C++,并且真的努力理解基础知识。指针一直是我的难点,我想确保在继续学习之前真正明白它,以免在以后路上混淆。

不幸的是,我在阅读教程时一开始就遇到了矛盾之处。有些人这样声明指针:

int *x

有些人是这样做的:

int* x

现在这两种方式中前者似乎是最常见的。这让我很不爽,因为第二种对我来说更有意义。当我看到int *x时,我会读作“这里有一个int型变量,它的名字是*x”,但这并不完全正确。但当我看到第二种方式时,我会理解为“这是一个int类型的指针,它的名字是x”,这样更加准确。

所以,在我建立自己的思维模型之前,这两种方式之间是否存在功能上的区别?如果我采用第二种方式,我会成为被排斥的人吗?

谢谢。


1
奇怪的答案:早在2002年,我使用C平台上的Turbo编译器,其中int* x, y;中的x和y都是指针。但是在声明中,我写成了int* x,y;... x是整数的指针,而y是整数!尽管int* x;int *x;都可以给出整数的指针。 - Grijesh Chauhan
2
你刚刚引发了一场潜在的圣战和一大堆无用的转述答案。 - Alexander Shukaev
2
我更喜欢 int * x; :p - Simon G.
http://kera.name/articles/2010/05/tomalaks-monday-monstrous-rant-i-align-your-asterisks/ - Lightness Races in Orbit
2
std::add_pointer<int>::type x; 没有空格问题。 - Marc Glisse
显示剩余2条评论
10个回答

21
著名的C++创建者和开发者Bjarne Stroustrup说过:“'int* p;'和'int *p;'之间的选择不是对与错的抉择,而是关于代码风格和强调的选择。在C语言中,表达式被强调;声明通常只被视为必需的恶。而C++则更加注重类型。”
“典型的C程序员”会写出“int *p;”,并解释它为“*p是int类型的内容”,强调语法,并可能引用C(和C++)的声明语法来证明其格式正确性。事实上,“*”在语法中与名称p结合。
“典型的C++程序员”会写出“int* p;”,并解释它为“p是指向int类型的指针”,强调类型。事实上,p的类型是int*。我清晰地偏爱这种强调方式,并认为它对于熟练使用C++的高级部分非常重要。”
所以,这没有区别。这只是一种代码风格。
来源位于这里

11
很遗憾,Stroustrup是错误的。 - cdhowie
4
以什么方式?我没有看到过有关使用哪种方式的C++程序员数量的研究。我觉得我更经常看到int* p而不是int *p,Stroustrup显然也这样认为。 - Joseph Mansfield
5
可读性错误来自在单行上声明多个变量, 没有好的理由这样做, 它只会带来更多潜在的问题而不是解决问题 (基本上是因为懒惰), 这就是为什么当你在真正的公司工作时, 大多数良好的编码标准都禁止这样做。 - user420442
5
但是谁会写出像int* x, y;这样的代码呢?通常编码指南都建议不要将两个声明放在同一行上。这种情况确实发生在旧版C语言中,当你必须在块的顶部声明所有变量时。例如,在嵌套循环中,你可能会写成int i, j, k;。当然,在C++以及现代C中,每个声明都应该在for语句中。 - James Kanze
2
@sftrabbit 在 C 语言早期,当你必须在块的顶部声明所有变量时,有些情况下这是可以被证明是合理的。但在 C++ 中,从来没有这种情况。 - James Kanze
显示剩余8条评论

11

对于编译器而言,它们的含义完全相同。

从文体上讲,两种写法都有支持和反对的观点。

其中一个观点是第一种版本更可取,因为第二种版本:

int* x, y, z;

这意味着xyz都是指针,但实际上并不是(只有x是指针)。

第一个版本没有这个问题:

int *x, y, z;

换句话说,由于*绑定的是变量名而不是类型,将其放在变量名旁边是有意义的。

反对意见是,在同一声明中不应混合指针和非指针类型。如果不这样做,则上述论点不适用,因此将*放在int旁边(因为它是类型的一部分)是有意义的。

无论你选择哪种观点,你都会在实践中遇到这两种风格,以及更多其他的写法(例如有些人写成int * x)。


个人而言,int *x 更直观。 - Jason Sperske
1
我完全同意你的看法,但是我也建议对任何在真实代码中编写这两行代码的人进行严厉的批评。 - Praetorian
不,反驳是这个论点很荒谬。你真的经常写 int* x, y 吗?这里有更重要的问题需要关注。 :) - Lightness Races in Orbit
@LightnessRacesinOrbit:撇开利弊不谈,我个人认为有比放置空格更重要的问题需要争论;-) - NPE
@NPE:这也是真的。但在争论空格的范围内... :P - Lightness Races in Orbit

5

没有任何区别。

只是风格不同而已。

个人 更喜欢这种方式:

int *x;

在此基础上,

...

int* x;

因为在同一行声明多个变量时,后者的可读性较差。例如,请参见以下内容:

int* x, y, z;

这里x是一个指向int的指针,但是yz也是指针吗?看起来像是指针,但它们实际上不是


1
好的回答,Nawaz。很久没见了...请阅读我对OP问题的评论... - Grijesh Chauhan
1
但是没有合理的程序员会在一行上编写多个声明。 - James Kanze
@JamesKanze 这就是为什么这个问题可能会出现的原因 :) Nawaz的建议是正确/好的,正如我的经验所述(我发布了问题)。 - Grijesh Chauhan
@JamesKanze: 这个声明 point x, y, z; 有何不合理之处? - Nawaz
@Nawaz,这有什么合理的呢?把它分成三行会更易读。(但我想看看上下文。我愿意承认可能会有例外。但只有在三种类型相同时,例如在C语言中声明int i, j, k之前,我们可以将声明直接放在for中。) - James Kanze
显示剩余3条评论

3
没有区别。我使用 int* x 的形式是因为我喜欢将所有类型都分组放在名称之外,但这种方式在更复杂的类型中(如int (*x)[10])会有些混乱。
有些人喜欢使用 int *x,因为你可以将其读作“解引用x给你一个int”。但是,当你开始使用引用类型时,即使这种方式也会失效;int &x 并不意味着取x的地址会给你一个int
你可能更喜欢使用 int *x 是因为在语法上,int是声明说明符序列,*x是声明符。它们是声明的两个独立部分。当你有多个声明符时,比如int *x, y;,这一点就更明显了。在这种情况下,你可能更容易看出y不是指针。
然而,像我这样的许多人更喜欢不要在单个声明中声明多个变量;在C++中确实没有太多需要这样做的情况。这可能是更喜欢 int* x 形式的另一个原因。
只有一个规则:保持一致。

3
但是谁会在同一行上声明多个变量呢?这是一个不必要的功能,来自C语言,所有好的程序员都会避免使用它。 - James Kanze
我喜欢@cdhowie的表现,他似乎代表了整个50%的程序员群体,甚至没有先咨询他们的意见! - Lightness Races in Orbit
@LightnessRacesinOrbit 在这里提出的问题中,“我们”指的是sftrabbit在“有些人更喜欢…”这个陈述中所指的同一群人。在这种情况下,“我们”指的是“我们中那些喜欢这种形式的人之所以这样做,是因为…”。我从未暗示我代表了50%的程序员人口,如果你从我的陈述中推断出这个意思,那么你理解错了。 - cdhowie
@LightnessRacesinOrbit 非常好。因此,我将修改这个陈述,让“我们”指的是“我在职业生涯中遇到的许多人更喜欢这种形式”。 - cdhowie
@cdhowie:谢谢:) 无论如何,int *x 在那种罕见的极端情况下可能是错误抵抗性的,但它绝对不是像 int* x 那样不易误解的。 - Lightness Races in Orbit
显示剩余3条评论

2

完全没有区别。


1
没有区别。我倾向于喜欢使用

标签。

int* x

由于将 'x' 视为 int* 类型。

1

对于编译器来说,它们是相同的

但是同时,当存在多个变量时,差异在于可读性

int *x,y

然而,这更具有误导性

int* x,y


0

两者是相同的。

虽然前者更受欢迎。假设您想在同一行中声明2个指针p和q。

int* p,q;

这实际上意味着'p'是指向int的指针,而'q'是int。

正确的语法应该是:

int* p,*q;

因此,在指针名称中包含*。


0

这是一种编码风格。没有区别,只是个人偏好而已,就像你自己所说的一样。希望你明白了。享受编程吧。


-2
在我看来,在表达式int * x,y;中,xy是变量的名称。当程序员这样声明这些名称时,它意味着它们具有相同的类型,而int *就是这个类型。

1
不幸的是,int* x, y; 的意思是 y 是一个 int,而不是一个 int* - user395760

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接