我是c ++的新手。
有一个名为node的结构。
为什么是
node* a = NULL;
a = new node;
可能,但
double* d = NULL;
d = 12.0;
不是吗?我只是不明白为什么这行不通...
非常感谢
答案 0 :(得分:4)
您在这里:
double* d = NULL;
d = new double;
*d = 12;
完成操作后,请记住删除d
。
答案 1 :(得分:0)
您可以创建struct或使用new加倍。您可以创建结构或双精度结构而无需新的结构。在这方面,结构和双精度之间没有区别。
node* a = new node;
double* b = new double(12.0);
node c;
double d = 12.0;
a
和b
是用new
创建的,c
和d
是在没有new
的情况下创建的。
答案 2 :(得分:0)
对于类型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
答案 3 :(得分:0)
在此代码段中
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 };