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

Why can I not define two pointers at once?

本文关键字:两个 指针 定义 一次 为什么 不能      更新时间:2023-10-16

我有一些代码不起作用,解决方案非常简单:简单地以更长的方式编写所有代码。即以下内容:

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

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 问题,我无法通过此错误找到(?

Foo* x = f,
y = f;

这相当于:

Foo* x = f;
Foo y = f;

您需要添加另一个*

Foo* x = f,
*y = f;
这就是为什么

Foo* x的常见C++风格,而不是像C语言中的首选风格那样Foo *x,是错误的错误错误。

一元*作用于其边的事物,而不是作用于其左边的事物。 你

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是指向非常量Foo的常量指针y是指向非常量Foo的非常量指针

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

  Foo* x = f,
       y = f;

在功能上等效于:

  Foo* x = f,
  Foo  y = f;

如您所见,xy不属于同一类型。因此,错误。

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

Foo *x, y;
您需要

对定义的每个变量重复*

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;......