为什么可以使用指针创建新结构,但不能以相同的方式创建双精度?



我是 c++ 的新手。

有一个名为节点的结构。

为什么

node* a = NULL;
a = new node;

可能,但是

double* d = NULL;
d = 12.0;

莫?我只是不明白为什么这不起作用...

多谢

你来了:

double* d = NULL;
d = new double;
*d = 12;

完成后,请记住删除d

您可以使用 new 创建结构或双精度。您可以在没有 new 的情况下创建结构或双精度。结构和双精度之间没有区别(在这方面)。

node* a = new node;
double* b = new double(12.0);
node c;
double d = 12.0;

ab是用new创建的,cd是在没有new的情况下创建的。

对于类型double,您正在初始化为NULL,然后将其指向12.0,这是完全错误的。要写入指针指向的内存,您必须尊重它:*d和尊重d你必须确保它实际上指向内存中的有效点。完成后,使用新的必须附带delete。您可以改用智能指针来不处理内存泄漏。下面是一个示例:

#include <memory>
#include <iostream>
int main() {
std::unique_ptr<double> a;
a.reset(new double);
*a.get() = 12;
std::cout <<*a.get();
}

请参阅此处的编译: https://godbolt.org/z/zHfE8O

在此代码片段中

node* a = NULL;
a = new node;

表达式new node的类型为node *。所以表达式语句的左右两侧

a = new node;

具有相同的类型。也就是说,您可以将类型node *的对象与另一个相同类型的对象node *

在此代码片段中

double* d = NULL;
d = 12.0;

变量d的类型为double *,但浮点文本12.0的类型为double

所以表达式语句的左右两侧

d = 12.0;

具有不同的类型,并且没有从类型double到类型double *的隐式转换。

因此,编译器将发出错误。

如果要将值写入指针指向的内存d首先要分配要在其中写入值的内存12.0

您可以通过以下方式进行操作

double* d = new double;
*d = 12.0;

或者你可以在一行中做到这一点

double *d = new double( 12.0 );

考虑结构节点的情况。

假设节点是按以下方式声明的

struct node
{
double value;
node *next;
};

并且有一个声明

node *a = NULL;

所以这个说法

a = new node;

仅向节点分配内存,但不为其数据成员设置值。

因此,要为节点设置值,您可以在分配内存后写入

( *a ).value = 12.0;
( *a ).next  = NULL;

或(相同)

a->value = 12.0;
a->next  = NULL;

所有这些也可以在一条线上完成

node *a = new node { 12.0, NULL };

相关内容

最新更新