C++中关于数组与指针的⼏处难点
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)的指针

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。