为什么我不能一次定义两个指针?

时间:2016-11-14 19:02:11

标签: c++ pointers

我有一些代码无效,解决方案非常简单:只需更长时间地编写代码即可。即,以下内容:

我知道以下是正确的代码:

int main() {
    int a = 1,
        b = 2;
    return 0;
}

但我很惊讶地看到以下错误:

struct Foo {
    int a = 0;
};


int main() {
    Foo* f = new Foo;
    Foo* x = f,
         y = f;
    return 0;
}

这会出现以下错误:

error: conversion from ‘Foo*’ to non-scalar type ‘Foo’ requested
          y = f;
              ^

即使您将xy的定义替换为:

,它也会有效
Foo* x = f;
Foo* y = f;

那么有人可以解释为什么不允许这样做(或者将我重定向到解释这个问题的不可避免的其他SO问题,这是我错过的错误)?

4 个答案:

答案 0 :(得分:4)

Foo* x = f,
y = f;

这相当于:

Foo* x = f;
Foo y = f;

您需要添加另一个*

Foo* x = f,
*y = f;

答案 1 :(得分:1)

  Foo* x = f,
       y = f;

在功能上等同于:

  Foo* x = f,
  Foo  y = f;

如您所见,xy的类型不同。因此,错误。

这是"功能之一" C和C ++。就个人而言,我总是将*附加到标识符,以便最大限度地减少此类问题:

Foo *x, y;

答案 2 :(得分:1)

这就是为什么编写Foo* x而不是Foo *x作为C中首选样式的常见C ++样式错误的错误。

一元*对其的事物起作用,而不是左边的事物。您的

Foo* x = f,
     y = f;

相同
Foo *x = f;
Foo y = f;

如果你想坚持使用速记,你必须为你声明的每个变量写一个星号:

Foo *x = f,
    *y = f;

const之类的修饰词则相反;他们修改了左边的东西。

Foo const x, y;

相同
Foo const x;
Foo const y;

但请注意

Foo *const x,
    *y;

其中x const指针非const Foo y非常量指针再次对非const Foo。

(现在在C和C ++中,首选的样式是每个分号只写一个变量声明,这真的不那么令人困惑。我偶尔会写int i, j, k;,但只有这样才那么简单。 )

答案 3 :(得分:0)

您需要为定义的每个变量重复*

Foo *x = f,
    *y = f;

否则,您将x声明为Foo*而将y声明为Foo(无法收到Foo*值)Foo *x = f, y = f;相当于Foo *x = f; Foo y = f;而不是Foo *x = f; Foo *y = f;可以想象......