【问题标题】:Why is it possible to create a new struct using a pointer but not to create a double the same way? [closed]为什么可以使用指针创建新结构,但不能以相同的方式创建双精度结构? [关闭]
【发布时间】:2019-06-08 13:02:29
【问题描述】:

我是 C++ 新手。

有一个名为 node 的结构。

为什么

node* a = NULL;

a = new node;

可能,但是

double* d = NULL;

d = 12.0;

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

非常感谢

【问题讨论】:

  • new 返回一个指针,12.0 不是一个。
  • 因为12.0 不是指针?
  • d = new double(12.0);
  • 你应该得到a good C++ book并从中学习。
  • 您可以指定 0,因为它是整数。无论指针指向什么,都不能将 double 分配给指针。 char* ptr = 0.0 也不起作用。 char* ptr = 0 将。

标签: c++ pointers struct


【解决方案1】:

给你:

double* d = NULL;

d = new double;

*d = 12;

完成后记得删除d

【讨论】:

  • 那么在这种情况下有必要使用“new”吗?
  • @Gabonica 你为什么要使用原始指针?
  • 我没有在项目中使用它们,它是用于讲座的。我只是不明白为什么使用指针名称创建一个全新的对象是有效的,但是创建一个没有 new 单词的 double 却不行。另外,我不明白为什么可以创建一个指向双精度的指针并使用“&”给它一个值,但是不可能通过使用给一个指向节点的指针(一个已经存在的节点)一个值“&”。我才刚刚开始,我还在弄清楚指针是如何工作的……
  • @Gabonica 不,您不需要使用 new。你需要的是 1. 一个对象 2. 指针必须指向对象 3. 然后你可以通过指针间接访问该对象。新建只是创建对象的一种方式。定义变量是另一回事。
  • 请不要教他们使用NULL,使用nullptr。
【解决方案2】:

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

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

node c;
double d = 12.0;

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

【讨论】:

  • 啊,好的,所以如果我想创建一个对象,可以使用 new-operator 使用指向地址的指针。如果我想创建一个变量,那么使用指针是不可能的,而是根据定义。对吗?
  • 或多或少,但变量也是对象。这里的重要区别是所创建对象的生命周期。使用new 创建的对象将一直存在,直到它们成为deleted。通过声明变量创建的对象在变量超出范围之前一直存在。
【解决方案3】:

对于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

【讨论】:

    【解决方案4】:

    在这段代码中sn-p

    node* a = NULL;
    
    a = new node;
    

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

    a = new node;
    

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

    在这段代码中sn-p

    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 );
    

    考虑结构节点的情况。

    假设 node 声明如下

    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 };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2019-02-01
      • 2019-11-08
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多