【问题标题】:Is there a difference between int *x and int* x in C++? [duplicate]C++ 中的 int *x 和 int* x 有区别吗? [复制]
【发布时间】:2013-04-10 17:52:29
【问题描述】:

我正在重新开始我的 C++ 研究,并真正尝试了解基础知识。指针总是给我带来麻烦,我想确保我真的明白了,然后再继续下去并在路上感到困惑。

遗憾的是,我从一开始就被我正在阅读的教程中的不一致所困扰。有些人以这种方式进行指针声明:

int *x

有些人这样做:

int* x

现在两者中的前者似乎是迄今为止最常见的。这令人不安,因为第二个对我来说更有意义。当我读到 int *x 时,我读到“这是一个 int,它的名字是 *x”,这不太对。但是当我阅读第二个时,我看到“这是一个int指针,它的名字是x”,这很准确。

那么,在我建立自己的思维导图之前,两者之间是否存在功能差异?如果我这样做,我会成为麻风病人的弃儿吗?

谢谢。

【问题讨论】:

  • 奇怪的答案:早在 2002 年,我在 C 平台上就有 Turbo 编译器,其中 int* x, y; 两个 x,y 都是指针。但是在编译器中,我声明 int* x,y; ... x 是指向整数的指针,yint !!.. 虽然 int* x;int *x; 都给出了指向整数的指针。
  • 你刚刚发起了一场潜在的圣战和大量无用的释义答案。
  • @GrijeshChauhan:在这方面,C和C++是一样的,所以当你写int* x, y时,那么x是指向int的指针,yint。跨度>
  • 我更喜欢int * x; :p
  • std::add_pointer<int>::type x; 好了,没有间距问题。

标签: c++ variables pointers naming-conventions declaration


【解决方案1】:

著名的Bjarne Stroustrup,以C++的创造和发展着称...

“int* p;”之间的选择和“int *p;”不是关于正确和 错了,但关于风格和重点。 C 强调表达; 声明常常被认为只是一种必要的罪恶。 另一方面,C++ 非常强调类型。

“典型的 C 程序员”会写“int *p;”并解释它“*p 是什么 是 int" 强调语法,并且可能指向 C(和 C++) 声明语法来论证样式的正确性。确实, * 绑定到语法中的名称 p。

“典型的 C++ 程序员”会写“int* p;”并解释它“p是一个 指向 int 的指针”强调类型。确实 p 的类型是 int*。我 显然更喜欢这种强调,并认为它对于使用 更高级的 C++ 部分。

所以,没有区别。这只是一种代码风格。

来自here

【讨论】:

  • 不幸的是,Stroustrup 错了。
  • @cdhowie 以什么方式?我还没有研究过有多少 C++ 程序员这样做。我觉得我看到int* p 的次数比我看到int *p 的次数要多,而且 Stroustrup 显然认为他也是。
  • 在一行中声明多个变量会导致可读性错误。这样做没有充分的理由,它只会导致比它解决的问题更多的潜在问题(基本上就是懒惰),这就是为什么在为真正的公司工作时你会遇到的大多数体面的编码标准都不允许这样做。
  • @cdhowie 但是像int* x, y; 这样的东西是谁写的?一般来说,编码指南坚持不要将两个声明放在同一行。当您必须在块的顶部声明所有变量时,这种事情确实发生在旧 C 中。例如,对于嵌套循环,您可以编写 int i, j, k;。当然,在 C++(和现代 C)中,这些声明中的每一个都将在 for 语句中。
  • @sftrabbit 在早期的 C 语言中,当您必须在块的顶部声明所有变量时,有些上下文可以证明它是合理的。在 C++ 中,永远不会。
【解决方案2】:

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

在风格上,两者都有支持和反对的论据。

一个论点是第一个版本更可取,因为第二个版本:

int* x, y, z;

暗示xyz 都是指针,它们不是(只有x 是)。

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

int *x, y, z;

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

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

无论您决定订阅哪种思想流派,您都会在野外遇到这两种风格,甚至更多(有些人写信 int * x)。

【讨论】:

  • 个人int *x更直观。
  • 我完全同意你的观点,但我也建议任何用实际代码编写这两行代码的人都可以好好地踢。
  • 不,相反的论点是这个论点是荒谬的。你多久写一次int* x, y真的There are far more important concerns at work here。 :)
  • @LightnessRacesinOrbit:除了利弊之外,我个人认为还有比在哪里放置空格更重要的问题要争论 ;-)
  • @NPE:这也是真的。但是在争论空格的范围内......:P
【解决方案3】:

完全没有区别。

这只是风格问题。

个人更喜欢这个:

int *x;

在此,

int* x;

因为当您在同一行声明许多变量时,后者的可读性较差。例如,看这个:

int* x, y, z;

这里x 是指向int 的指针,但yz 也是指针吗? 看起来它们是指针,但它们不是

【讨论】:

  • 很好的答案 Nawaz 很长一段时间...阅读我对 OP 问题的评论...
  • 但是没有一个理性的程序员会在一行上写多个声明。
  • @JamesKanze 这就是为什么这个问题可能会出现 :) Nawaz 的建议是正确的/我的经验很好(我发帖提问。)
  • @JamesKanze:这个声明point x, y, z;有什么不合理的地方?
  • @Nawaz 这有什么合理的?把它放在三行上会更具可读性。 (但我想看看上下文。我愿意承认可能会有例外。但只有当这三种类型相同时,比如我们在 C 中声明 int i, j, k' 时,我们才能放置声明直接在for.)
【解决方案4】:

没有区别。我使用int* x 表单,因为我更喜欢将所有类型组合在一起远离名称,但这种类型与更复杂的类型如int (*x)[10] 分开。

有些人更喜欢int *x,因为您可以将其理解为“取消引用x 给您一个int”。但是,当您开始使用引用类型时,即使这样也会崩溃。 int &x 并不意味着获取x 的地址会给你一个int

您可能更喜欢int *x 的另一个原因是,就语法而言,int 是声明说明符序列,*x 是声明符。它们是声明的两个独立部分。当您有多个像int *x, y; 这样的声明符时,这一点变得更加明显。在这种情况下,可能更容易看出y 不是指针。

但是,很多人,比如我自己,不喜欢在一个声明中声明多个变量;在 C++ 中没有太多需要。这可能是首选int* x 表单的另一个原因。

只有一条规则:保持一致。

【讨论】:

  • 这不是我们更喜欢int *x 的原因,我们更喜欢它,因为当您在同一行声明多个变量时它更不容易出错。更喜欢抗错的形式。
  • @cdhowie 公平点。我也为此添加了一段!
  • @cdhowie 但是谁在同一行声明了多个变量。这是 C 语言遗留下来的错误特征,所有优秀的程序员都会避免。
  • 我很享受 @cdhowie 在没有事先咨询他们的情况下为 50% 的程序员群体说话的方式!
  • @LightnessRacesinOrbit 在此处提出的原始答案的上下文中,“我们”指的是 sftrabbit 在声明“有些人更喜欢......”中所指的人。在这种情况下,“我们”指的是“我们这些确实喜欢这种形式的人这样做是因为......”我从未暗示我代表了 50% 的程序员群体,如果你从我的陈述中推断出这个意思,那么你就误读了。
【解决方案5】:

绝对没有区别。

【讨论】:

    【解决方案6】:

    没有区别。我更喜欢

    int* x
    

    由于认为 'x' 具有 int* 类型。

    【讨论】:

      【解决方案7】:

      对于编译器来说它们是一样的

      但同时不同的是当有多个变量时可读性

      int *x,y

      不过这样更容易误导

      int* x,y

      【讨论】:

        【解决方案8】:

        两者是一样的。

        虽然首选前者。假设你想在同一行声明 2 个指针 p & q。

        int* p, q;

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

        正确的语法是:

        int* p, *q;

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

        【讨论】:

          【解决方案9】:

          这是一种编码风格。没有区别,只是你自己说的偏好问题。希望你清楚。享受编码

          【讨论】:

            【解决方案10】:

            在我看来,表达式中的int * x,y; xy 是变量的名称。当程序员这样声明这些名称时,这意味着它们有same typeint * 是 输入。

            【讨论】:

            • 很遗憾,int* x, y; 表示 yint,而不是 int*
            猜你喜欢
            • 1970-01-01
            • 2012-02-15
            • 1970-01-01
            • 2021-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多