




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态创建二维数组正确的做法:方法一:void fun(int iRow, int iCol) CString* ppData; ppData = new CString*iRow; for(int i=0;i iRow;+i) ppDatai = new CStringiCol; 方法二:void fun(int iRow, int iCol) CString* pTemp; CString* ppData; pTemp =new CStringiRow*iCol; ppData = new CString*iRow; for(int i=0;idata = ppData; 出错!崩溃 正确的语句是:Info* infoTest = (Info*)malloc(sizeof(Info); 正确/申请ppData空间infoTest-data = ppData; (4)删除二维指针对于方法一创建的数组:int j;for(j=0;j iRow;j+) delete ppDataj; delete ppData;【注:方法一:void fun(int iRow, int iCol) CString* ppData; ppData = new CString*iRow; for(int i=0;i iRow;+i) ppDatai = new CStringiCol; 】 对于方法二创建的数组:delete ppData;delete pTemp; 【注:方法二:void fun(int iRow, int iCol) CString* pTemp; CString* ppData; pTemp =new CStringiRow*iCol; ppData = new CString*iRow; for(int i=0;i iRow;+i) ppDatai =&pTempi*iCol; 例如构造一个整型的二维数组: int row,col;(设已被初始化) int *p = new int* row; for(int i = 0; i row; i+) pi = new intcol; / 删除时: for(int i = 0 i row; i+) delete pi; delete p; - 看看下面的; /*计算方法-动态开辟内存空间-yanfeng*/ /*注意:1).本程序已解决了由用户自由输入n的值,已决定矩阵中元素的个数。 2).可以通过输入行数的值x,列数的值y,来确定一个x*y大小的矩阵,但x或y的值不能为0。 3).在C+中可以通过new和delete运算符动态开辟和释放空间,和本程序有相同作用。 4).如果对数组需调用函数,实参和形参都需用指针,形参值a,b改变,实参也将跟着改变。 */ #include #include void main() int x,y,i,j; float *a,*b; printf(请输入你所求解的线性方程组的行数x:x=); scanf(%d,&x); printf(请输入你所求解的线性方程组的列数y:y=); scanf(%d,&y); a=(float *)malloc(sizeof(float *) *x); b=(float *)malloc(sizeof(float) *x); for(i=0;ix;i+) *(a+i)=(float *)malloc(sizeof(float) *y); /*读入数据*/ printf(请按行的顺序依次输入系数的值(共%d项):,x*y); for(i=0;i=x-1;i+) for(j=0;j=y-1;j+) scanf(%f,&aij); printf(请按列的顺序依次输入常数的值(共%d项):,x); for(j=0;j=x-1;j+) scanf(%f,&bj); printf(您输入方程组的增广矩阵为:n); for(i=0;i=x-1;i+) for(j=0;j=y-1;j+) printf(%.5f ,aij); printf(%.5f ,bi); printf(n); free(b); for(i=0;ix;i+) free (*(a+i); / float choose_the_main(float *a,float *b,int k);/*形参*/ / choose_the_main(a,b,k);/*实参*/ 在C+中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的。C+中动态分配二维数组的方法,很少有C+语言书中描述,我查找了有的C+语言书中提到了一个方法:假定二维数组的维数为MN分配是可以这样: int *ptr=new int*M; /这是先动态分配一个包含有M个指针的数组,即指先分配一个针数组 /指针数组的首地址保存在ptr中 for(int i=0;iM;i+) ptri=new intN; /为指针数组的每个元素赋一个地址, /这个地址是指向一维数组的地址,也即是为针元数组的每个元素分配一个数组 一个源代码的例子为: int *pMatrix = new int*row; for(int i = 0; i row; i+) pMatrixi = new intcolumn; for(int j = 0; j column; j+) pMatrixij = (i+j); /简单的初始化 这样创建一个数组有个严重的问题,就是它的内存不连续,行与行之间的内存不连续,虽然可以用ij下标访问,无法满足用指向二维数组元素型别的指针变量来访问整个数组的要求例如不能如下访问每个二维数组元素: int * p = NULL; for(p = pMatrix0; p pMatrix0+column * row; p+) int fff = *(pme); 而这种访问方式对于真正的二维数组是完全可以的。出现这种原因就是因为行与行之间的内存不连续造成的。所以,这中方式创建的动态二维数组,不是真正意义上的二维数组。那么什么是真正的二维数组呢?C语言中的二维数组在内存组织形式是按行存储的连续的内存区域。所以,必须保证数组元素是按行存储的,而且也是最重要的是内存要连续。所以,我写出了如下的一个方法:假定二维数组的元素变量类型是MyType;可以是C语言接受的除void之外的任何类型,因为编译器不晓得void类型的大小;例如int,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); if(!ptdhead) return FALSE; ptdBody = ptdhead + row ; for(int ncount = 0; ncount row; ncount+) ptdheadncount = ptdBody + ncount * column* sizeof(MyType)/sizeof(void*); MyType*ptdheadRealse; ptdheadRealse = (MyType*)ptdhead;/强制转换为自己程序需要的二维数组元素类型的指针 ptdhead = NULL; for(int i = 0; i row; i+ ) for(int j = 0; j column; j+) ptdheadRealseij = i+j; /进行简单的初始化; 这样的一种方法动态分配的二维数组,内存是连续的,是真正意义的C语言二维数组,满足所有二维数组访问的方法,而且内存利用效率高,程序性能好。这样一种分配方法要理解的是一下一点概念:体会,只要是指针都可以带,不管使直接指针,还是间接指针,都可以用下标,只要使指针就可以了,这个很关键;另外就是要明白void*的指针是不能够用于加减法的,因为系统不晓得一个void型的大小,但是void*指针却是可以进行加减法,进行指针偏移的,因为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);从这里,我们可以理解为什么我们用v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 包头市2025内蒙古包头市招商投资促进局所属事业单位人才引进1人笔试历年参考题库附带答案详解
- 上海市2025上海应用技术大学大学生心理健康教育中心专职人员招聘2人笔试历年参考题库附带答案详解
- 2025福建晋江市市政工程建设有限公司权属公司招聘6人笔试参考题库附带答案详解
- 2025浙江金华金开宏业产业运营管理有限公司招聘5人笔试参考题库附带答案详解
- 2025年度河南西沟电力有限责任公司招聘工作人员2名笔试参考题库附带答案详解
- 2025年安徽国控资本有限公司社会招聘17人笔试参考题库附带答案详解
- 2025年亳州公用事业发展有限公司古井供水工程项目人员招聘10人笔试参考题库附带答案详解
- 2025山东农科生物科技发展有限公司招聘16人笔试参考题库附带答案详解
- 2025四川虹微技术有限公司招聘软件开发工程师等岗位8人笔试参考题库附带答案详解
- 2025内蒙古锡林郭勒盟阿巴嘎旗城乡建设投资集团有限公司招聘12人笔试参考题库附带答案详解
- 光缆敷设检验批质量验收记录通用表
- 全成本管理探索与实践
- 电烙铁焊接技术培训
- 石群邱关源电路(第1至7单元)白底课件
- GB/T 40529-2021船舶与海洋技术起货绞车
- GB 31603-2015食品安全国家标准食品接触材料及制品生产通用卫生规范
- GA 392-2009警服雨衣
- 关于公布2016年度中国电力优质工程奖评审结果的通知
- 商务礼仪情景剧剧本范文(通用5篇)
- 幼教培训课件:《家园共育体系建构与实施策略》
- 《电子制造技术-电子封装》配套教学课件
评论
0/150
提交评论