指针(指向指针)和新/malloc 向量(向量内部)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)一样。

如果您想了解更多有关它的信息,我建议您查看有关指针的文章,其中还提到了此运算符并提供了更多技术解释。

最新更新