C++ 结构数组 - 为什么它必须是指针
C++ Struct Array - Why does it have to be a pointer?
我花了一段时间才弄清楚如何制作我创建的数据结构数组。我最终认为它必须是一个指针,但为什么呢?
struct Food{
int weight;
double price;
string name;
};
Food *foods = new Food[5]; // Why a pointer?
因为new[]
分配一个内存块,并为您提供指向该内存的指针。在new Food[5]
的情况下,将有空间容纳五个类型为 Food
的对象,每个对象都是默认构造的。你得到的指针是指向五个对象中的第一个Food
对象。
您也可以使用
Food foods[5];
以创建数组。
但是,在C++中创建"数组"的首选方法是使用 std::array
或者如果您需要动态数组(或需要它在堆上(std::vector
std::array<Food, 5> foods; // Create a static fixed-size array of 5 Food objects
std::vector<Food> foods(5); // Create a dynamic, expandable array of 5 Food object
你不一定需要它是一个指针,你可以很容易地创建一个全局/本地数组:
Food foods[5];
在堆上时,数组可以是可变参数长度:
Food *foods = new Food[std::rand() + 1];
但是您必须将它们作为数组显式删除:
delete[] foods; // otherwise they leak
大多数情况下,使用STL的容器是有意义的:
#include <vector>
#include <array>
std::vector<Food> foods(5, cheezeburger()); // in case we need more cheeseburgers
std::array<Food, 5> foods; // in case five cheeseburgers should be enough for everyone
他们会为您完成所有烦人的内存管理。
STL 的自动指针也知道堆上的数组。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么++(*p)更改指针值
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么指针不写入类的地址?
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 为什么要增加导致崩溃的指针
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 共享指针:为什么没有双免费
- 指向2D数组的指针(为什么起作用)
- 函数指针 - 为什么,什么时候我可以没有
- C++ 函数指针 -- 为什么会这样
- 不支持在c或c++中添加两个指针.为什么?
- 无效的指针-为什么
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么
- 在信号代码中将整数转换为函数指针-为什么这样做?
- 指向结构体作为函数参数的指针-为什么不更新其值