指针(指针)和new / malloc向量(向量内部)c ++

时间:2017-08-15 08:29:36

标签: c++

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

bubSort(L,L).

以上示例有效。通常*需要在指向写入/读取值的指针前面,但不能在向量之前?

多维数组的情况更复杂,我发现以下是一种创建方法(16x3):

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

同样,上述工作,但很难掌握语法与指针的关系。语法也适用于malloc。对于malloc,有一个选项“memset”,它自动初始化多维数组(放入for循环)。是否有新的类似选项?

2 个答案:

答案 0 :(得分:3)

  

通常*需要在指向写入/读取值的指针前面,但不能在向量之前?

您始终需要取消引用指针以获取指向的值。下标运算符只是另一种取消引用它的方法。 a[b]等同于*(a+b)(除非a是具有重载下标运算符的类)。

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

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

  

再次,上述作品

行为未定义。

  

使用malloc有一个选项&#34; memset&#34;它自动初始化多维数组(放入for循环)。是否有新的类似选项?

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

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

P.S。您没有释放分配的内存。因此,你泄漏了内存。

P.P.S将pointeres存储到裸指针中的动态对象是一个坏主意。使用像std::vector这样的RAII容器会更好。

答案 1 :(得分:1)

这种语法有效,因为operator [](称为偏移量运算符)与operator *的作用相同,但会将指针递增一些量。因此a[5]*(a+5)相同。

如果您想了解更多信息,我建议您查看article about pointer,他们也会提及此操作符并提供更多技术说明。