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)的指针

猜你喜欢

转载自blog.csdn.net/qq_14874791/article/details/47439657