为什么我不能一次定义两个指针
Why can I not define two pointers at once?
我有一些代码不起作用,解决方案非常简单:简单地以更长的方式编写所有代码。即以下内容:
我知道以下是正确的代码:
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;
^
即使如果你将x
和y
的定义替换为:
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;
如您所见,x
和y
不属于同一类型。因此,错误。
这是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;
......
相关文章:
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何将值添加到嵌套结构中,该结构在C++中有两个指针
- 比较两个指针时">="运算符的奇怪行为
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 错误 :"+" 无法添加两个指针
- 使与同一数组无关的两个指针减去未定义行为的基本原理是什么?
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 如何加入两个指针以将其串在一起并将其存储在数组或字符中
- 如何在多线程 c++ 17 程序中交换两个指针
- 这两个指针怎么能有相同的值
- 为什么两个指针都有相同的内存地址
- 两个指针之间的差异是合法的 c++17 常量表达式
- 为什么两个指向相同链接的两个指针在这里表现不同
- 这两个指针代码有什么区别
- 使用指针在Qt Creator UI中的其他两个指针之间切换
- 重写虚函数协变返回类型(两个指针)
- 想要一种在C++中交换两个指针的有效方法
- 在delete()之后不会断言两个指针都指向NULL
- 更改指针指向指针的位置,同时保持其他两个指针的值