为什么我需要使用双星号?**

Inz*_*zen 1 c++ pointers class dynamic-memory-allocation dynamic-arrays

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

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

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

int size = 0;
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

\n
#include <iostream>\nusing namespace std;\n\nclass Box { //Some Example class\npublic:\n  int val{10};\n};\n\n\nvoid addBox(Box* box, int &size) { //Implementation using *\n  box = new Box;\n  size++;\n  return;\n}\n\nint main() {\n  Box *bptr{nullptr};\n  int size{0};\n  addBox(bptr, size);\n  cout << bptr->val << endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

调用 addBox 之后、执行之前,内存将如下所示:
\n在此输入图像描述

\n

当 addBox 调用new并在堆上分配一个新的 Box 对象时,内存将如下所示:\n在此输入图像描述

\n

但是,当范围addBox()完成并且控制权返回到 main 时,堆内存位置不再可寻址,bptr仍然有nullptr
\n在此输入图像描述

\n

因此,bptr->val会引发分段错误。

\n
\n

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

\n
#include <iostream>\nusing namespace std;\n\nclass Box { //Some Example class\npublic:\n  int val{10};\n};\n\nvoid addBox(Box** box, int &size) {\n  *box = new Box;\n  size++;\n  return;\n}\n\nint main() {\n  Box *bptr{nullptr};\n  int size{0};\n  addBox(&bptr, size);\n  cout << bptr->val << endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

就在之后addBox()被称为:

\n

在此输入图像描述

\n

new分配:

\n

在此输入图像描述

\n

最后,当我们返回到 时main,堆分配信息完好无损。\n在此输入图像描述

\n

并且 callbptr->val会将值正确打印为 10。
\n对于您的作业,您需要跟踪对 的每次调用addBox,它属于链表的概念。

\n