在C++中声明指针时,将星号放置的位置是否重要?

11

我正在学习C ++,在过去的几天里,我查看了所有示例代码,但很难理解指针应该放在哪里。

这3个有什么区别?

1. char* x = /* ... */
2. char *y = /* ... */
3. char * z = /* ... */

或者

1. ClassX* x = /* ... */
2. ClassY *y = /* ... */
3. ClassZ * z = /* ... */
感谢你的帮助。

5
你忘记了 char*w ;-) - fredoverflow
@Fred,那种编码风格甚至让Bjarne Stroustrup头疼。 :) - Mateen Ulhaq
还有typedef char *CHAR_PTR; CHAR_PTR w;... - Mateen Ulhaq
3个回答

18
没有区别,它们完全相同。 你可以按任何喜欢的方式编写它。通常,C++程序员将星号放在类型旁边,而C程序员更倾向于将星号放在变量名称旁边。
唯一需要注意的陷阱是当你在单行上声明多个变量时(如果不是因为这个原因,你真的不应该这样做)。例如,在以下语句中,只有变量x被声明为指针:
char* x, y;

将其与以下代码进行比较,这让指针变量更加清晰明了:

char *x, y;
据我所知,第三种语法出现是因为在两个主要选项之间做出了不好的妥协。某人决定将星号放在中间,而不是将其放在其中一个旁边,这大概是唯一一个明显不适合放置星号的地方。

1
就个人而言,我使用第三种语法的原因与我在写英语时在单词之间放空格的原因相同,但这只是我的个人习惯。 - Mike Seymour
@Mike:这是一个有趣的观点,我从未考虑过。尽管争论关于指针修改哪个信息最具争议性,但我从未见过这样的争论,即它是一种独立的语义信息(一个“单词”),完全能够独立存在。 - Cody Gray
我从未见过空格除了在必要时分隔标记和以令作者感到愉悦的方式排列代码之外具有任何重要意义的论点。然而,有些人似乎坚持将某些深层语义意义读入其中。 - Mike Seymour
1
个人而言,我使用第一种语法的原因与我在英语中为复数添加“s”的原因相同。你写代码的方式反映了你思考代码的方式,有些方式比其他方式更有效率。 - MSalters
1
我可以投票将此标记为答案吗?问题的作者似乎在2011年就放弃了StackOverflow。 - Paul

2

没有区别,但是需要注意的是,如果您这样写:

char* x, y;

只有x是指针(第一个声明的变量),您应该以这种方式引用它们:

x = new (char);
*x = 'a';
y = 'b';

0

虽然 * 有时会放在变量旁边,但它实际上属于类型声明。因此,以下代码:

SomeType *x, *y;

真正的意思是

SomeType *x;
SomeType *y;

同样的规则也适用于 &。此外,*const& 的应用顺序取决于它们与声明类型的接近程度。例如:
const SomeType * const *&x = ...;

这意味着:引用指向常量指针的指针,指向常量 SomeType。 const 可以放在类型名称之前和之后。类型之前的 const 会应用于类型之后的所有修饰符。还要注意,不允许这样做:

const SomeType const x = ...;

这实际上意味着 const const SomeType,这没有多少意义。

1
(SomeType *)x; 只能被解释为包含一个强制类型转换表达式的表达式语句,它不能是一个声明,因此你的“真正意思”是不正确的。 - CB Bailey
@Charles,我写了关于这不是有效类型声明的评论。也许这不是一个好的表述方式。 - julx
好的,也许我误解了你的意思。 - CB Bailey
@Charles,我修改了我的答案。删除了有问题的部分,并补充了一些相关信息来使其更加实用。 - julx

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