学习补漏:指针数组与双重指针形成的二维数组的异同

怎甘沉沦 提交于 2019-12-17 01:28:12

暴露的问题
(1):对指针数组形成二维数组的理解不深
(2):对普通指针与指针数组的内存情况产生混淆
(3):对new生成的二维数组的delete方法

问题(1):指针数组构建二维数组的原理:
心得理解: ①:指针数组本身就形成了一层数组,若要形成二维数组,仅仅需要新增一层数组内存
②:所以单纯的指针变量若要形成二维数组,需要形成两层数组(形成指针数组–>形成二维数组)

问题(2):普通指针与指针数组内存情况混淆
(√):

int **p;   //定义双层指针;
//【1】正确的写法
//****①分配指针数组内存
p=new int*[n];  
//****②由指针数组生成二维数组
for(int i=0;i<n;i++)
{
p[i]=new int[n];    //开辟第二层(非指针内存)
}

//【2】错误的写法
//****①:混淆双层指针与指针数组的内存情况
for(int i=0;i<n;i++)
{
p[i]=new int[n];
}
//原因分析: 双层指针只分配有单一内存(4个字节),而没有分配相应的内存。
//*****②:混淆动态开辟内存的原理:
错误: int **p=new int[n];
分析: (1)int *p=new int[20]:(右侧返回了一个新开辟的地址,所以用指针变量接受)
分析:  (2int **p; //指向指针的指针,由上面分析可知,新开辟的内存应该由一层指针接受,所以**不能直接接受

问题(3):如何delete new开辟的动态数组
【1】:由指针数组动态生成的二维数组

for(int i=0;i<n;i++)
{
delete []p[i];   //由于每个元素都开辟了新的内存空间
}

【2】:由双层指针形成的二维数组

for(int i=0;i<n;i++)
{
delete []p[i];  //撤销数组元素生成的指针数组
}    //
delete []p;   //撤销生成的指针数组
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!