指针如何与数组一起使用?我发现语法有点神秘,例如(16x1):
bubSort(L,L).
以上示例有效。通常*需要在指向写入/读取值的指针前面,但不能在向量之前?
多维数组的情况更复杂,我发现以下是一种创建方法(16x3):
int* a = new int[16];
a[16] = 33;
cout << a[16] << endl;
同样,上述工作,但很难掌握语法与指针的关系。语法也适用于malloc。对于malloc,有一个选项“memset”,它自动初始化多维数组(放入for循环)。是否有新的类似选项?
答案 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,他们也会提及此操作符并提供更多技术说明。