二维数组定义以及动态分配空间_第1页
二维数组定义以及动态分配空间_第2页
二维数组定义以及动态分配空间_第3页
二维数组定义以及动态分配空间_第4页
二维数组定义以及动态分配空间_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、二维数组定义以及动态分配空间(转)下面三种定义形式怎么理解?怎么动态分配空间?、int*Ptr;、int*Ptr5;我更喜欢写成int*Prt5;、int(*Ptr)5;此文引自网上,出处不详,但是觉得非常好。略改了一点。多维数组一向很难,一般都采用一维数组,但是一旦要用到还真是头疼。闲话少说,这里我就以三个二维数组的比较来展开讨论:、int*Ptr;、int*Ptr5;我更喜欢写成int*Prt5;、int(*Ptr)5;以上三例都是整数的二维数组,都可以用形如Ptr11的方式访问其内容;但它们的差别却是很大的。下面我从四个方面对它们进行讨论:一、内容:它们本身都是指针,它们的最终内容都是整

2、数。注意我这里说的是最终内容,而不是中间内容,比如你写Ptr0,对于三者来说,其内容都是一个整数指针,即int*;Ptr11这样的形式才是其最终内容。二、意义:(1)、int*Ptr表示指向一群指向整数的指针的指针。(2)、int*Ptr5表示指向5个指向整数的指针的指针,或者说Ptr有5个指向一群整数的指针,Ptr是这5个指针构成的数组的地址(3)、int(*Ptr)5表示指向一群指向5个整数数组的指针的指针。三、所占空间:(1)、int*Ptr和(3)、int(*Ptr)5一样,在32位平台里,都是4字节,即一个指针。但(2)、int*Ptr5不同,它是5个指针,它占5*4=20个字节的内

3、存空间。四、用法:、int*Ptr因为是指针的指针,需要两次内存分配才能使用其最终内容。首先,Ptr=(int*)newint*5;这样分配好了以后,它和(2)的意义相同了;然后要分别对5个指针进行内存分配,例如:Ptr0=newint20;它表示为第0个指针分配20个整数,分配好以后,Ptr0为指向20个整数的数组。这时可以使用下标用法Ptr00到Ptr019了。如果没有第一次内存分配,该Ptr是个野指针,是不能使用的,如果没有第二次内存分配,则Ptr0等也是个野指针,也是不能用的。当然,用它指向某个已经定义的地址则是允许的,那是另外的用法(类似于借鸡生蛋的做法),这里不作讨论(下同)。例子

4、:C语言:/动态分配二维数组空间mHight=10;二维数组的高度m;/二维数组的宽度动态分配一个二维数组m_ppTable内存空间/其类型为int/m_ppTable指向该数组int*m_ppTable;m_ppTable=newint*m_iHight;动态分配mHight个类型为int*的内存空间/分配的是行地址空间for(inti=0;im_ppTablei=newintm_iWidth;动态分配mWidth个类型为int的内存空间/分配的是某行的数值空间/由此分配的二维数组空间并非是连续的可以使用m_ppTablerowcol来给该二维数组赋值/其中0=row/释放所分配的内存空间f

5、or(inti=0;ideletem_iWidthm_ppTablei;/以行为单位释放数值空间deletem_iHightm_ppTable;/释放行地址空间int*a;a=(int*)calloc(sizeof(int*),n);for(i=0;iai=(int*)calloc(sizeof(int),n);这样就可以了使用的时候就和普通的二维数组一样最后用for(i=0;icfree(ai);cfree(a);释放内存就可以了、int*Ptr5这样定义的话,编译器已经为它分配了5个指针的空间,这相当于(1)中的第一次内存分配。根据对(1)的讨论可知,显然要对其进行一次内存分配的。否则就是

6、野指针。、int(*Ptr)5这种定义我觉得很费解,不是不懂,而是觉得理解起来特别吃力,也许是我不太习惯这样的定义吧。怎么描述它呢?它的意义是一群指针,每个指针都是指向一个5个整数的数组。如果想分配k个指针这样写:Ptr=(int(*)5)newint5*k。这是一次性的内存分配。分配好以后,Ptr指向一片连续的地址空间,其中Ptr0指向第0个5个整数数组的首地址,Ptr1指向第1个5个整数数组的首地址。综上所述,我觉得可以这样理解它们:int*PtrintPtrxy;int*Ptr5intPtr5x;int(*Ptr)5intPtrx5;这里x和y是表示若干的意思。1.C语言动态分配二维数组

7、(1)已知第二维Code-1char(*a)N;指向数组的指针a=(char(*)N)malloc(sizeof(char*)*m);printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/N,维数组free(a);已知第一维Code-2char*aM;/指针的数组inti;for(i=0;iM;i+)ai=(char*)malloc(sizeof(char)*n);printf(%dn,sizeof(a);/4*M,指针数组printf(%dn,sizeof(a0);/4,指针for(i=0;iM;i+)free(ai);已知第一维,一次分配内存(保

8、证内存的连续性)Code-3char*aM;/指针的数组inti;a0=(char*)malloc(sizeof(char)*M*n);for(i=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4*M,指针数组printf(%dn,sizeof(a0);/4,指针free(a0);两维都未知Code-4char*a;inti;a=(char*)malloc(sizeof(char*)*m);分配指针数组for(i=0;im;i+)ai=(char*)malloc(sizeof(char)*n);分配每个指针所指向的数组printf(%dn,sizeof(a);

9、/4,指针printf(%dn,sizeof(a0);/4,指针for(i=0;im;i+)free(ai);free(a);(5)两维都未知,一次分配内存(保证内存的连续性)Code-5char*a;inti;a=(char*)malloc(sizeof(char*)*m);/分配指针数组a0=(char*)malloc(sizeof(char)*m*n);/一次性分配所有空间for(i=1;im;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/4,指针free(a0);free(a);2.C+动态分配二维数组已知第

10、二维Code-6char(*a)N;/指向数组的指针a=newcharmN;printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/N,维数组deletea;已知第一维Code-7char*aM;/指针的数组for(inti=0;iM;i+)ai=newcharn;printf(%dn,sizeof(a);/4*M,指针数组printf(%dn,sizeof(a0);/4,指针for(i=0;iM;i+)deleteai;(3)已知第一维,一次分配内存(保证内存的连续性)Code-8char*aM;指针的数组a0=newcharM*n;for(inti

11、=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4*M,指针数组printf(%dn,sizeof(a0);/4,指针deletea0;两维都未知Code-9char*a;a=newchar*m;/分配指针数组for(inti=0;im;i+)ai=newcharn;分配每个指针所指向的数组printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/4,指针for(i=0;im;i+)deleteai;deletea;两维都未知,一次分配内存(保证内存的连续性)Code-10char*a;a=newchar*m;a0=ne

12、wcharm*n;/一次性分配所有空间for(inti=1;im;i+)ai=ai-1+n;/分配每个指针所指向的数组printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/4,指针deletea0;deletea;多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!3.静态二维数组作为函数参数传递如果采用上述几种方法动态分配二维数组,那么将对应的数据类型作为函数参数就可以了。这里讨论静态二维数组作为函数参数传递,即按照以下的调用方式:inta23;func(a);C语言中将静态二维数组作为参数

13、传递比较麻烦,一般需要指明第二维的长度,如果不给定第二维长度,则只能先将其作为一维指针传递,然后利用二维数组的线性存储特性,在函数体内转化为对指定元素的访问。首先写好测试代码,以验证参数传递的正确性:给定第二维长度Code-11voidfunc(intaN)printf(%dn,a12);不给定第二维长度Code-12voidfunc(int*a)printf(%dn,a1*N+2);/计算元素位置注意:使用该函数时需要将二维数组首地址强制转换为一维指针,即func(int*)a);1.C语言动态分配二维数组(1)已知第二维Code-1char(*a)N;指向数组的指针a=(char(*)N)

14、malloc(sizeof(char*)*m);printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/N,一维数组free(a);已知第一维Code-2char*aM;/指针的数组inti;for(i=0;iM;i+)ai=(char*)malloc(sizeof(char)*n);printf(%dn,sizeof(a);/4*M,指针数组printf(%dn,sizeof(a0);/4,指针for(i=0;iM;i+)free(ai);已知第一维,一次分配内存(保证内存的连续性)Code-3char*aM;/指针的数组inti;a0=(char*

15、)malloc(sizeof(char)*M*n);for(i=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4*M,指针数组printf(%dn,sizeof(a0);/4,指针free(a0);两维都未知Code-4char*a;inti;a=(char*)malloc(sizeof(char*)*m);/分配指针数组for(i=0;im;i+)ai=(char*)malloc(sizeof(char)*n);/分配每个指针所指向的数组printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/4,指针for(i=0;

16、im;i+)free(ai);free(a);两维都未知,一次分配内存(保证内存的连续性)Code-5char*a;inti;a=(char*)malloc(sizeof(char*)*m);/分配指针数组a0=(char*)malloc(sizeof(char)*m*n);/一次性分配所有空间for(i=1;im;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/4,指针free(a0);free(a);2.C+动态分配二维数组已知第二维Code-6char(*a)N;/指向数组的指针a=newcharmN;print

17、f(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/N,维数组deletea;已知第一维Code-7char*aM;/指针的数组for(inti=0;iM;i+)ai=newcharn;printf(%dn,sizeof(a);/4*M,指针数组printf(%dn,sizeof(a0);/4,指针for(i=0;iM;i+)deleteai;(3)已知第一维,一次分配内存(保证内存的连续性)Code-8char*aM;/指针的数组a0=newcharM*n;for(inti=1;iM;i+)ai=ai-1+n;printf(%dn,sizeof(a);/4

18、*M,指针数组printf(%dn,sizeof(a0);/4,指针deletea0;两维都未知Code-9char*a;a=newchar*m;/分配指针数组for(inti=0;im;i+)ai=newcharn;分配每个指针所指向的数组printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/4,指针for(i=0;im;i+)deleteai;deletea;两维都未知,一次分配内存(保证内存的连续性)Code-10char*a;a=newchar*m;a0=newcharm*n;/一次性分配所有空间for(inti=1;im;i+)ai=ai-1+n;/分配每个指针所指向的数组printf(%dn,sizeof(a);/4,指针printf(%dn,sizeof(a0);/4,指针deletea0;deletea;多说一句:new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!3.静态二维数组作为函数参数传递如果采用上述几种方法动态分配二维数组,那么将对应的数据类型作为函数参数就可以了。这里讨论静态二维数组作为函数参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论