指针(指向指针)和新/malloc 向量(向量内部)c++
Pointers (to pointers) and new/malloc vectors (inside of vectors) c++
指针如何处理数组?我发现语法有点神秘,示例 (16x1(:
int* a = new int[16];
a[16] = 33;
cout << a[16] << endl;
上面的例子有效。通常 * 需要在指针前面写入/读取值,而不是向量?
对于多维数组来说,情况更复杂,我找到了以下创建方法(16x3(:
int** a = (int**)new int[16];
for (int i = 0; i < 16; i++)
{
a[i] = (int*)new int[3];
}
a[15][2] = 4;
cout << a[15][2] << endl;
同样,上述方法有效,但很难掌握语法与指针的关系。该语法也适用于 malloc。使用 malloc 有一个选项"memset",它会自动初始化多维数组(放入 for 循环中(。新的选项有类似的选项吗?
通常 * 需要在指针前面写入/读取值,而不是向量?
始终需要取消引用指针才能获取指向的值。下标运算符只是取消引用它的另一种方法。a[b]
等效于*(a+b)
(除非a
是具有重载下标运算符的类(。
int** a = (int**)new int[16];
这是一个错误。您已经分配了一个int
数组,但尝试指向第一个元素,就好像它是一个int*
一样。如果需要指针数组,则必须在新表达式中指定正确的类型 (int*
(。避免此类错误的一种方法是永远不要强制转换new
的返回值。然后编译器会在您犯错时告诉您。
再次,上述作品
行为未定义。
使用 malloc 有一个选项"memset",它会自动初始化多维数组(放入 for 循环中(。新的选项有类似的选项吗?
memset
也在标准库中C++但初始化不需要它。更简单的是使用值初始化。另请注意正确的类型和缺少铸造:
int** a = new int*[16]();
// ^ syntax for value initialization
附言您不会释放已分配的内存。因此,您泄漏了内存。
P.P.S 将指向动态对象的指针存储在裸指针中是一个坏主意。最好使用像std::vector
这样的 RAII 容器。
此语法有效是因为 operator[](称为偏移量运算符(的工作方式与运算符 * 相同,但指针增加了一定量。所以a[5]
和*(a+5)
一样。
如果您想了解更多有关它的信息,我建议您查看有关指针的文章,其中还提到了此运算符并提供了更多技术解释。
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量