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

时间:2019-06-08 13:02:29

标签: c++ pointers struct

我是c ++的新手。

有一个名为node的结构。

为什么是

node* a = NULL;

a = new node;

可能,但

double* d = NULL;

d = 12.0;

不是吗?我只是不明白为什么这行不通...

非常感谢

4 个答案:

答案 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;

ab是用new创建的,cd是在没有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 };