我是 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;
a
和b
是用new
创建的,c
和d
是在没有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 };