语言中动态分配二维数组_第1页
语言中动态分配二维数组_第2页
语言中动态分配二维数组_第3页
语言中动态分配二维数组_第4页
语言中动态分配二维数组_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的。C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C语言书中提到了一个方法:假定二维数组的维数为MN分配是可以这样:     int   *ptr=new   int*M; /这是先动态分配一个包含有M个指针的数组,即指先分配一个针数组  /指针数组的首地址保存在ptr中  for(int   i=0;i<M;i+)         &

2、#160;   ptri=new   intN; /为指针数组的每个元素赋一个地址,/这个地址是指向一维数组的地址,也即是为针元数组的每个元素分配一个数组    一个源代码的例子为: int *pMatrix = new int*row; for(int i = 0; i < row; i+)      pMatrixi  = new intcolumn;    for(int j = 0; j < co

3、lumn; j+)            pMatrixij = (i+j); /简单的初始化      这样创建一个数组有个严重的问题,就是它的内存不连续,行与行之间的内存不连续,虽然可以用ij下标访问,无法满足用指向二维数组元素型别的指针变量来访问整个数组的要求. 例如不能如下访问每个二维数组元素:  int * p = NULL; for(p = pMatrix0; p  < pMatrix0+colum

4、n * row; p+)      int fff = *(pme); 而这种访问方式对于真正的二维数组是完全可以的。出现这种原因就是因为行与行之间的内存不连续造成的。所以,这中方式创建的动态二维数组,不是真正意义上的二维数组。那么什么是真正的二维数组呢?C语言中的二维数组在内存组织形式是按行存储的连续的内存区域。所以,必须保证数组元素是按行存储的,而且也是最重要的是内存要连续。所以,我写出了如下的一个方法:假定二维数组的元素变量类型是MyType;可以是C语言接受的除void之外的任何类型,因为编译器不晓得void类型的大小;例如i

5、nt,float,double等等类型; int row = 2; /暂假定行数是2,这个可以在运行时刻决定; int column = 3;/暂假定列数是2,这个可以在运行时刻决定;   void *ptdhead = NULL; /在后面说明为什么要用void*类型   void *ptdBody = NULL;/在后面说明为什么要用void*类型   ptdhead = (void *)malloc(sizeof(void*)*row + sizeof(MyType)*row*column

6、);   if(!ptdhead)    return FALSE;   ptdBody = ptdhead + row ;       for(int ncount = 0; ncount < row; ncount+)         ptdheadncount = ptdBody + ncount * column* sizeof(MyType)/sizeof(void*);

7、   MyType*ptdheadRealse;   ptdheadRealse = (MyType*)ptdhead;/强制转换为自己程序需要的二维数组元素类型的指针   ptdhead = NULL;   for(int i = 0; i < row; i+ )        for(int j = 0; j< column; j+)          

8、0;  ptdheadRealseij = i+j;  /进行简单的初始化;        这样的一种方法动态分配的二维数组,内存是连续的,是真正意义的C语言二维数组,满足所有二维数组访问的方法,而且内存利用效率高,程序性能好。这样一种分配方法要理解的是一下一点概念:体会,只要是指针都可以带,不管使直接指针,还是间接指针,都可以用下标,只要使指针就可以了,这个很关键;另外就是要明白void*的指针是不能够用于加减法的,因为系统不晓得一个void型的大小,但是void*指针却是可以进行加减法,进行

9、指针偏移的,因为void*型大小使知道的,所以,编译器使可以计算出偏移地址的。由于void型,系统不晓得大小,所以,void *p = (void*)malloc(3); 编译器无法通过如 void *q = p+3;我们知道假设一个整型变量nCont在32位机器上是4个字节,q是指向nCont的指针变量,q的值,也就是nCont的地址是0x00032ec0,那么q+1的值为0x0x00032ec0+1*4,这是C语言中计算指针表达式值的方法。即q+1的值为q+1*sizeof(int);从这里,我们可以理解为什么我们用void*作为动态分配内存函数返回的类型,因为,如果返回的是void*类型

10、,我们无法计算地址的偏移量,即无法计算出数组首元素的地址,也就是数组的地址。当然,我们可以不用void*,可以用除了void*的任何C中内嵌的简单类型,不过如果考虑使用起来简单,方便,那么我觉得还是悬着用void*,或者char*;选择char*类型方便的是,char类型的大小是1,那么元素的个数,即等于地址的偏移量。构建实例一维#include <stdio.h> #include <stdlib.h> int main() int n1,i; int *array; puts("输入一维长度:"); scanf("%d",&a

11、mp;n1); array=(int*)malloc(n1*sizeof(int);/第一维 for(i=0;i<n1;i+) arrayi=i+1; printf("%dt",arrayi); free(array);/释放第一维指针 return 0; 二维#include <stdlib.h> #include <stdio.h> int main() int n1,n2; int *array,i,j; puts("输入一维长度:"); scanf("%d",&n1); puts(&quo

12、t;输入二维长度:"); scanf("%d",&n2); array=(int*)malloc(n1*sizeof(int*); /第一维 for(i=0;i<n1; i+) arrayi=(int*)malloc(n2* sizeof(int);/第二维 for(j=0;j<n2;j+) arrayij=i+j+1; printf("%dt",arrayij); puts(""); for(i=0;i<n1;i+) free(arrayi);/释放第二维指针 free(array);/释放第一维

13、指针 return 0; 三维#include <stdlib.h> #include <stdio.h> int main() int n1,n2,n3; int *array; int i,j,k; puts("输入一维长度:"); scanf("%d",&n1); puts("输入二维长度:"); scanf("%d",&n2); puts("输入三维长度:"); scanf("%d",&n3); array=(int*)

14、malloc(n1*sizeof(int*);/第一维 for(i=0; i<n1; i+) arrayi=(int*)malloc(n2*sizeof(int*); /第二维 for(j=0;j<n2;j+) arrayij=(int*)malloc(n3*sizeof(int); /第三维 for(k=0;k<n3;k+) arrayijk=i+j+k+1;printf("%dt",arrayijk); puts(""); puts(""); for(i=0;i<n1;i+) for(j=0;j<n2

15、;j+) free(arrayij);/释放第三维指针 for(i=0;i<n1;i+) free(arrayi);/释放第二维指针 free(array);/释放第一维指针 return 0; 四维#include <stdlib.h> #include <stdio.h> int main() int n1,n2,n3,n4; int *array; int i,j,k,m; puts("输入一维长度:"); scanf("%d",&n1); puts("输入二维长度:"); scanf(&q

16、uot;%d",&n2); puts("输入三维长度:"); scanf("%d",&n3); puts("输入四维长度:"); scanf("%d",&n4); array=(int*)malloc(n1*sizeof(int*);/第一维for(i=0; i<n1; i+) arrayi=(int*)malloc(n2*sizeof(int*); /第二维 for(j=0;j<n2;j+) arrayij=(int*)malloc(n3*sizeof(int*);

17、/第三维 for(k=0;k<n3;k+) arrayijk=(int*)malloc(n4*sizeof(int);/第四维 for(m=0;m<n4;m+) arrayijkm=i+j+k+m+1; printf("%dt",arrayijkm); puts(""); puts(""); puts(""); for(i=0;i<n1;i+) for(j=0;j<n2;j+) for(k=0;k<n3;k+) free(arrayijk);/释放第四维指针 for(i=0;i<

18、n1;i+) for(j=0;j<n2;j+) free(arrayij);/释放第三维指针 for(i=0;i<n1;i+) free(arrayi);/释放第二维指针 free(array);/释放第一维指针 return 0; 以三维整型数组arrayn1n2n3为例。 先遵循从外层到里层,逐层申请的原则: 最外层指针是array,它是个三维指针,所指向的是array,其为二维指针。所以给array(三维指针) 申请内存应: array=(int*)calloc(n1,sizeof(int*); 次层指针是array,它是个二维指针,所指向的是array,其为一维指针。所以给array(二维指针)申请内存应: for(i=0;i<n1;i+) arrayi=(int*)calloc(n2,sizeof(int*); 最内层指针是array,它是个一维指针,所指向的是array,其是个整型常量。所以给ar

温馨提示

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

评论

0/150

提交评论