数组内存申请和释放,指针数组和数组指针
总结
对于指针数组的理解:
按照字面意思,首先是指针,其次是数组,就表明这是一个数组,不过数组里面存储的指针。
```
// 使用指针数组
int **ptr = new int*[4];
for(int i = 0; i < 4; ++i)
{
*(ptr+i) = new int [3];
}
```
如代码所示:new int * [4],表明这是一个数组,数组里面存储的是 int *类型的指针。
而等号左值 int ** ptr,首先要看(int *)*ptr ,表明这一个指针,其指向了int *类型的变量。
在看for循环内的内容,这是对数组内指针进行初始化,将数组内的每个指针指向了一个int[3]的数组,
当然这里int [3],也可以改为int[4]等,当然也可以为数组内,每个指针,分别制定不等长的数组。
对于数组指针的理解:
参照一位数组指针的定义
```
int * a = new int [3];
```
和
```
// 使用数组指针
int (*p)[3] = new int [4][3];
printf("数组指针:\np:\t%d\n&p[0]:\t%d\n*p:\t%d\np[0]:\t%d\n&p[0][0]:%d\n\n"
,p,&p[0],*p,p[0],&p[0][0]);
```
等号右值,都是数组,等号左值依然是int *p ,不过因为其实二维数组,所以
在其后,增加了指示二维的[3],以表明,其第二维的维度为3
问题:
对于下面的代码:
```
class myString;
myString *pStringArray = new myString[13];
```
以下两种delete有什么区别?
```
delete pStringArray;
delete []pStringArray;
```
方括号的存在会使编译器获取数组大小(size)然后析构函数再被依次应用在每个元素上,一共size次。否则,只有一个元素被析构。
博客原文:
http://blog.csdn.net/xietingcandice/article/details/41545119
```
//============================================================================
// Name : TS.cpp
// Author : jiudianren
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <functional>
#include <stdlib.h>
#include <vector>
#include <stdio.h>
using namespace std;
int main()
{
int * a = new int [3];
printf("一维数组:\na:\t%d\n*a:\t%d\n&a[0]:\t%d\n\n"
,a,*a,&a[0]);
// 使用指针数组
int **ptr = new int*[4];
for(int i = 0; i < 4; ++i)
{
*(ptr+i) = new int [3];
}
printf("指针数组一步步申请:\nptr:\t%d\n&ptr[0]:%d\n*ptr:\t%d\nptr[0]:\t%d\n&ptr[0][0]:%d\n\n"
,ptr,&ptr[0],*ptr,ptr[0],&ptr[0][0]);
// 使用数组指针
int (*p)[3] = new int [4][3];
printf("数组指针:\np:\t%d\n&p[0]:\t%d\n*p:\t%d\np[0]:\t%d\n&p[0][0]:%d\n\n"
,p,&p[0],*p,p[0],&p[0][0]);
// 释放内存
for(int i = 0; i < 4; ++i)
{
delete [] ptr[i]; //注意不要漏掉方括号
}
delete []ptr;
delete []p;
delete []a;
return 0;
}
```
输出
```
一维数组:
a: 3615416
*a: 3615824
&a[0]: 3615416
指针数组一步步申请:
ptr: 3615440
&ptr[0]:3615440
*ptr: 3615464
ptr[0]: 3615464
&ptr[0][0]:3615464
数组指针:
p: 3615560
&p[0]: 3615560
*p: 3615560
p[0]: 3615560
&p[0][0]:3615560
```