指针如何处理数组?我发现语法有点神秘,示例 (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)
一样。
如果您想了解更多有关它的信息,我建议您查看有关指针的文章,其中还提到了此运算符并提供了更多技术解释。