您的位置:首页 > 编程语言 > C语言/C++

C++中关于数组与指针的几处难点

2015-08-12 09:46 267 查看


C++中关于数组与指针的几处难点

在C++程序设计中数组与指针是两大利器,它们的使用可以使程序高效、简洁,二者之间有着密切的联系,合理地组合使用二者,将会发挥巨大的作用!而这也是难点所在,它们之间剪不断,理还乱的丝丝缕缕的联系,常会使得初学者“挠头抓狂”,有种“想说爱你不容易”的感觉,但它们的魅力又是如此之大,无人能逃!作为一个刚刚经历过此种痛苦的初学者,深深地懂得,如能把关于数组和指针的几个常用的又是较难的地方搞清楚,那对以后的程序编写将会有多么大的帮助!


一、 动态创建一维数组

int *ptr=new int[m]; //在堆中分配的内存

···

delete[] ptr //需手动释放内存


二、 动态创建多维数组

double**A = new double *[m];//创建指针数组,动态创建二维数组,类似于

//A[m]

for(inti=0;i<m;i++)

A[i]=newdouble
;//层层分配

···

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)的指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: