gpt4 book ai didi

c++ - 指针(指向指针)和新/malloc vector ( vector 内部)c++

转载 作者:行者123 更新时间:2023-11-27 22:43:58 24 4
gpt4 key购买 nike

指针如何与数组一起使用?我发现语法有点神秘,例如 (16x1):

int* a = new int[16];
a[16] = 33;
cout << a[16] << endl;

上面的例子有效。通常 * 需要在指针前面才能写入/读取值,而不是 vector ?

多维数组的情况更复杂,我发现了以下创建 (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 循环中)。 new 有类似的选项吗?

最佳答案

Usually * needs to be in front of a pointer to write/read the value, but not with vectors?

你总是需要取消引用一个指针来获得指向的值。下标运算符只是取消引用它的另一种方式。 a[b] 等同于 *(a+b)(除非 a 是一个重载下标运算符的类)。


int** a = (int**)new int[16];

这是一个错误。您已经分配了一个 int 数组,但尝试指向第一个元素,就像它是一个 int* 一样。如果需要指针数组,则必须在 new 表达式中指定正确的类型 (int*)。避免此类错误的一种方法是永远不要强制转换 new 的返回值。然后编译器会在你出错时告诉你。

Again, the above works

行为未定义。

With malloc there is an option "memset" which automatically initializes the multidimensional array (put in the for loop). Is there similar option with new?

memset 也在 C++ 标准库中,但您不需要它来进行初始化。更简单的是使用值初始化。还要注意正确的类型和缺少转换:

int** a = new int*[16]();
// ^ syntax for value initialization

附言您不会取消分配您分配的内存。因此你泄漏了内存。

P.P.S 在裸指针中存储指向动态对象的指针是个坏主意。最好使用像 std::vector 这样的 RAII 容器。

关于c++ - 指针(指向指针)和新/malloc vector ( vector 内部)c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45689190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com