【问题标题】:Why do I need to use double asterisk? **为什么我需要使用双星号? **
【发布时间】:2021-06-21 21:59:17
【问题描述】:

C++ 理论上,如果我有一个类,称为Box。我已经完成了所有变量和服务等。如果我被要求创建一个程序,我需要在其中创建一个指针类变量,它是一个动态数组。

为什么我需要使用 ex:Box **boxes= nullptr;

另外,如果有人问我,除了声明 Box 名称之外,我还需要声明一个整数变量大小等于 0:

int size = 0;

如何完成一个名为void addBox(Box** box, int &size) 的函数,以便每次调用它时我都会为 box 添加参数,并将另一个 box 添加到动态数组中?

仅供参考,我是编码新手,我需要将此概念应用到课堂上的项目中。

【问题讨论】:

  • Why do I need to use ex: Box **boxes= nullptr; 你没有。
  • type** 是指向另一个 type 类型指针的单个指针。 (比如Box **boxes;)如果您为多个指针分配存储空间并将起始地址分配给您的指针,您可以将分配块中的每个指针索引为boxes[0], boxes[1], ...。如果然后将地址分配给class Box 的实例,依次分配给每个指针,则可以将每个实例用作boxes[i]->member,等等。
  • 此外,void addBox(Box** box, int &size) 看起来像一个函数,用于将Box 类型的实例添加到链表(或堆栈或队列...)。在这种情况下,您可能会传递 address_ofBox 的单个实例(通常是列表中的 head 节点或具有链接节点的堆栈顶部)。您正在传递指针的地址,因此您可以更新函数中原始指针的地址,以便更改将在返回后继续存在(在 C++ 中,您还可以传递对指针的引用)。如果您只是传递一个指针,该函数会收到一个“副本”,并且更改会在返回时丢失..
  • 听起来您的讲师不知道如何教授 C++。确实应该是void addBox(std::vector<Box> & boxes),或者namespace learning { class box_vector { ... } }的成员函数

标签: c++ class pointers dynamic-memory-allocation dynamic-arrays


【解决方案1】:

让我回答为什么需要 ** 而不是 *
与直觉相反,如果我们使用 * 和代码,示例如下所示:

#include <iostream>
using namespace std;

class Box { //Some Example class
public:
  int val{10};
};


void addBox(Box* box, int &size) { //Implementation using *
  box = new Box;
  size++;
  return;
}

int main() {
  Box *bptr{nullptr};
  int size{0};
  addBox(bptr, size);
  cout << bptr->val << endl;
}

在调用 addBox 之后,在执行之前,内存将如下所示:

当 addBox 调用 new 并在堆上分配一个新的 Box 对象时,内存将如下所示:

但是,当addBox() 的作用域完成并且控制权返回到main 时,堆内存位置不再可寻址,bptr 仍然有nullptr

所以,bptr-&gt;val 会抛出分段错误。


但另一方面,如果我们使用双指针(**),这将是代码─

#include <iostream>
using namespace std;

class Box { //Some Example class
public:
  int val{10};
};

void addBox(Box** box, int &size) {
  *box = new Box;
  size++;
  return;
}

int main() {
  Box *bptr{nullptr};
  int size{0};
  addBox(&bptr, size);
  cout << bptr->val << endl;
}

addBox() 被调用之后:

new分配:

最后,当我们返回main时,堆分配信息完好无损。

调用bptr-&gt;val 将正确打印值为 10。
对于您的任务,您需要跟踪对addBox 的每次调用,它属于链表的概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多