Jad*_*era 26 c++ pointers dynamic multidimensional-array c++11
当我将它们调整到2维或更高时,我一直在使用动态指针运气不好.例如,我想要一个指向2D数组的指针.我知道:
int A[3][4];
int (*P)[4] = A;
Run Code Online (Sandbox Code Playgroud)
是完全合法的(即使我不完全理解为什么).考虑到:
int *P = new int[4];
Run Code Online (Sandbox Code Playgroud)
工作,我想象:
int **P = new int[5][7];
Run Code Online (Sandbox Code Playgroud)
也会有效,但事实并非如此.此代码说明错误:
Error: A value of type "(*)[7]" cannot be used to initialize an entity of
type "int **"
Run Code Online (Sandbox Code Playgroud)
看到这个,新的部分变成了一个指向我所做的7个整数数组的指针:
int (*P)[4] = new int[7][4];
Run Code Online (Sandbox Code Playgroud)
这确实有效,但这不是我想要完成的.通过这样做我至少限制为任何后续维度使用常量值,但我希望它在运行时完全定义,因此"动态".
我怎么能去使这个多维指针工作?
Dip*_*ole 68
让我们从一些基本的例子开始.
当你说 int *P = new int[4];
new int[4];
调用operator new函数()要绑定此引用,您需要具有与返回引用相同类型的指针,以便执行此操作
int *P = new int[4]; // As you created an array of integer
// you should assign it to a pointer-to-integer
Run Code Online (Sandbox Code Playgroud)对于多维数组,您需要分配一个指针数组,然后用指向数组的指针填充该数组,如下所示:
int **p;
p = new int*[5]; // dynamic `array (size 5) of pointers to int`
for (int i = 0; i < 5; ++i) {
p[i] = new int[10];
// each i-th pointer is now pointing to dynamic array (size 10)
// of actual int values
}
Run Code Online (Sandbox Code Playgroud)
这是它的样子:
对于一维数组,
// need to use the delete[] operator because we used the new[] operator
delete[] p; //free memory pointed by p;`
Run Code Online (Sandbox Code Playgroud)对于2d阵列,
// need to use the delete[] operator because we used the new[] operator
for(int i = 0; i < 5; ++i){
delete[] p[i];//deletes an inner array of integer;
}
delete[] p; //delete pointer holding array of pointers;
Run Code Online (Sandbox Code Playgroud)避免内存泄漏和悬空指针!
你想要的东西:
int **P = new int*[7];
p[0] = new int[5];
p[1] = new int[5];
...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
68110 次 |
最近记录: |