【问题标题】:Does it matter where I place the asterisk when declaring pointers in C++?在 C++ 中声明指针时,我将星号放在哪里有关系吗?
【发布时间】:2011-07-23 22:08:59
【问题描述】:

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

这3个有什么区别?

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

或者

1. ClassX* x = /* ... */
2. ClassY *y = /* ... */
3. ClassZ * z = /* ... */

感谢您的帮助。

【问题讨论】:

  • 你忘了char*w ;-)
  • @Fred 这种编码风格甚至让 Bjarne Stroustrup 头疼。 :)
  • 还有typedef char *CHAR_PTR; CHAR_PTR w;...

标签: c++ pointers syntax


【解决方案1】:

Algough * 有时会放在它确实属于类型声明的变量旁边。所以如下:

SomeType *x, *y;

真正的意思

SomeType *x;
SomeType *y;

& 也是如此。此外,*const& 按与声明类型接近的顺序应用。例如:

const SomeType * const *&x = ...;

意思是:对指向 const SomeType 的 const 指针的引用。 const 可以放在类型名称之前和之后。类型前的const 应用于类型后的所有修饰符之前。另请注意,这是不允许的:

const SomeType const x = ...;

因为它本质上意味着const const SomeType,这没有多大意义。

【讨论】:

  • (SomeType *)x; 只能解释为包含强制转换表达式的表达式语句,它不能是声明,因此您的“真正意思”不正确。
  • @Charles 好吧,我写了关于这不是有效类型声明的评论。也许这不是一个好的措辞方式。
  • 好吧,也许我完全误解了你的意思。
  • @Charles 我编辑了我的答案。删除了有问题的位并添加了更多信息以使其更有用。
【解决方案2】:

没有区别,但是写的时候一定要注意:

char* x, y;

只有 x 是一个指针(声明的第一个变量),你应该这样引用它们:

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

【讨论】:

    【解决方案3】:

    没有区别。它们完全相同。

    您可以随意选择编写它。通常,C++ 程序员将星号放在 type 旁边,而 C 程序员将星号放在 变量 的名称旁边更为常见。

    要注意的唯一缺陷是在一行中声明多个 变量(如果不是因为这个原因,你真的不应该这样做)。例如,在下面的语句中,只有变量 x 被声明为指针:

    char* x, y;
    

    与下面的比较,可以更清楚哪些变量是指针:

    char *x, y;
    

    据我所知,第三种语法是两个主要选项之间的一个糟糕的折衷方案。有人决定将星号放在中间,而不是将星号放在一个或另一个旁边,这大概是它唯一确定属于的地方。

    【讨论】:

    • 就我个人而言,我使用第三种语法的原因与我在写英语时在单词之间放置空格的原因相同,但这只是我。
    • @Mike:这是一个有趣的观点,而且我从未考虑过。尽管争论的焦点是指针修改了哪条信息,但我从未见过这样的论点:它完全是一条语义信息(一个“单词”),完全能够独立存在.
    • 我从未见过这样的论点,即空格除了在必要时分隔标记并以作者满意的方式布局代码之外还有任何意义。然而,有些人似乎坚持要在其中读入一些深刻的语义含义。
    • 就个人而言,我使用第一种语法的原因与我在英语中为复数附加一个“s”的原因相同。你的写作方式反映了你对代码的看法,有些方式比其他方式更有效率。
    • 我可以投票将此标记为答案吗?问题的作者似乎在 2011 年放弃了 StackOverflow。
    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多