版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 圣诞节幼儿园创意活动策划5篇
- 2025年植物油及其制品项目规划申请报告模式
- 2025年油烟净化设备项目提案报告
- 2025年气动球阀项目提案报告模稿
- 2025年制药用水设备项目申请报告模范
- 关于高中目标作文集锦五篇
- 物业主管转正报告
- 健康促进倡议书范文汇编6篇
- 文明礼仪演讲稿范文合集八篇
- 毕业大学生实习周报【五篇】
- 2024年-电大《中央银行理论与实务》期末复习资料(作业、蓝本、学习指导(黄本)、试卷)8
- 2024年度物业管理服务合同纠纷调解协议3篇
- 《全国较大事故案例》课件
- 2024-2025学年上学期天津初中地理七年级期末模拟卷1
- 2025版国家开放大学法学本科《国际私法》历年期末纸质考试多项选择题题库
- 甘肃兰州生物制品研究所笔试题库
- 梅花鹿养殖基地建设项目可行性研究报告
- 《面向生鲜食品配额优化的时间序列数据分析与应用》
- 网球俱乐部合伙合同模板
- 职工子女教育资助管理制度
- 小学校门口突发问题应急预案(5篇)
评论
0/150
提交评论