C++中关于数组与指针的几处难点
在C++程序设计中数组与指针是两大利器,它们的使用可以使程序高效、简洁,二者之间有着密切的联系,合理地组合使用二者,将会发挥巨大的作用!而这也是难点所在,它们之间剪不断,理还乱的丝丝缕缕的联系,常会使得初学者“挠头抓狂”,有种“想说爱你不容易”的感觉,但它们的魅力又是如此之大,无人能逃!作为一个刚刚经历过此种痛苦的初学者,深深地懂得,如能把关于数组和指针的几个常用的又是较难的地方搞清楚,那对以后的程序编写将会有多么大的帮助!
一、 动态创建一维数组
int *ptr=new int[m]; //在堆中分配的内存
···
delete[] ptr //需手动释放内存
二、 动态创建多维数组
double**A = new double *[m];//创建指针数组,动态创建二维数组,类似于
//A[m][n]
for(inti=0;i<m;i++)
A[i]=newdouble[n];//层层分配
···
for(int i=0;i<m;i++)
delete[] A[i]; //层层释放
delete[] A;
int ***B=new int **[a];//动态创建三维数组B[a][b][c]
for(int i=0;i<a;i++)
B[i]=newint *[b];
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
B[i][j]=newint [c];
···
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
delete[] B[i][j];
for(int i=0;i<a;i++)
delete[] B[i];
delete [] B;
更多维地动态创建数组,以此类推。
应特别注意的是,在用delete销毁动态创建的数组释放heap中的内存时,由于是“深度动态分配内存”,故应该层层释放内存。
另外,当输出各元素的地址时,由上可知,多维数组在内存中所占用的空间仅是每一行的各列之间是连续的,列与列以及层与层之间均不是连续的!
指针本身就是一个变量,当指向数组时也有类型,如:
int c[3][4][5];
&c:类型是int(*)[3][4][5]
&c+1:指的是&c+sizeof(int)*3*4*5
c :类型是int(*)[4][5]
c+1 :指的是c+sizeof(int)*4*5
*c :即c[0]=&c[0][0],类型是int(*)[5]
*c+1 :指的是c+sizeof(int)*5
*c[0],即c[0][0]=&c[0][0][0] :类型是int*
*c[0]+1:指的是&c[0][0][1]
三、 指针数组与数组指针
优先级:()>[]>*,由低优先级向高优先级读
数组指针 ,指向数组的指针
int(*p)[5]; 此时,p为一个指向含有5个int类型元素数组的指针
int(*p)[4][5]; 指向二维数组的指针
int*(*p)[3]; 指向指针数组的指针
指针数组 ,每个元素都是指针类型
int*p[10]; 此时,p为一个含有10个指针类型元素的数组,可以用来创建列不定的二维数组;
int**p[3];二重指针数组,指向指针的指针的数组,有3个元素,每个元素都是int**(指向指针的指针)型
指针的指针(二重指针):int**,指向指针的指针,如
inta=1;
int*p1=&a;
int**p2=&p1;
四、 数组作为函数参数
void function(int [],int);//声明
void function(int a[],int size)//定义
{
···
}
function(a,3)//调用
C++中实际上是将数组作为指针来传递的,该指针指向数组的第一个元素
数组作为形参时退化为指针
三维数组,退化为指向二维数组的指针,
二维数组,退化为指向一维数组的指针,
一维数组,退化为指向类型(如int)的指针