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与直觉相反,如果我们使用 * 和代码,则示例如下所示:
#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}\nRun Code Online (Sandbox Code Playgroud)\n\n当 addBox 调用new并在堆上分配一个新的 Box 对象时,内存将如下所示:\n
但是,当范围addBox()完成并且控制权返回到 main 时,堆内存位置不再可寻址,bptr仍然有nullptr
\n
因此,bptr->val会引发分段错误。
但另一方面,如果我们使用双指针(**),这将是代码\xe2\x94\x80
#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}\nRun Code Online (Sandbox Code Playgroud)\n就在之后addBox()被称为:
new分配:
并且 callbptr->val会将值正确打印为 10。
\n对于您的作业,您需要跟踪对 的每次调用addBox,它属于链表的概念。