《第22讲 动态数组精选文档.ppt》由会员分享,可在线阅读,更多相关《第22讲 动态数组精选文档.ppt(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第2222讲讲讲讲 动态数组动态数组动态数组动态数组本讲稿第一页,共十页学习方法学习方法读程序:上机单步执行(跟踪法)观察读程序:上机单步执行(跟踪法)观察程序的执行顺序以及程序中各变量的值程序的执行顺序以及程序中各变量的值的变化。或者人工模拟计算机执行,要的变化。或者人工模拟计算机执行,要手工进行计算。手工进行计算。写程序:写程序:先逐层地写算法!先逐层地写算法!再写程序!再写程序!2本讲稿第二页,共十页重要提示:重要提示:什么时候用指针:什么时候用指针:当想用指针间接引用变量的时候当想用指针间接引用变量的时候当想希望用指针提高程序效率的时候当想希望用指针提高程序效率的时候不要:不要:
2、能直接引用变量的时候不要用指针能直接引用变量的时候不要用指针能用数组名字指针数组的时候不要用指针能用数组名字指针数组的时候不要用指针3本讲稿第三页,共十页问题问题当我们处理实际问题时,如何申请空间当我们处理实际问题时,如何申请空间?int a100;/*总是有一定的浪费总是有一定的浪费*/int an;/*不合法不合法*/如何根据实际需要申请如何根据实际需要申请n个内存存放个内存存放n个个数据?数据?4本讲稿第四页,共十页四、动态分配内存四、动态分配内存?问题:如何解决根据班级实际人数来定问题:如何解决根据班级实际人数来定义数组?义数组?自己根据实际需要向系统申请内存自己根据实际需要向系统申请
3、内存如何申请呢?如何申请呢?5本讲稿第五页,共十页三个相关库函数三个相关库函数#includeinclude void void*malloc(*malloc(unsignedunsigned intint size);size);向系统申请大小为向系统申请大小为向系统申请大小为向系统申请大小为sizesize的内存块,把首地址返回。如果申的内存块,把首地址返回。如果申的内存块,把首地址返回。如果申的内存块,把首地址返回。如果申请不成功,返回请不成功,返回请不成功,返回请不成功,返回NULLNULL void void*calloc(*calloc(unsigned intunsigned i
4、nt num,num,unsigned intunsigned int size);size);向系统申请向系统申请向系统申请向系统申请numnum个个个个sizesize大小的内存块,把首地址返回。如果大小的内存块,把首地址返回。如果大小的内存块,把首地址返回。如果大小的内存块,把首地址返回。如果申请不成功,返回申请不成功,返回申请不成功,返回申请不成功,返回NULLNULL voidvoid free(free(voidvoid*p);*p);释放由释放由释放由释放由malloc()malloc()和和和和calloc()calloc()申请的内存块。申请的内存块。申请的内存块。申请的内存
5、块。p p是指向此块的是指向此块的是指向此块的是指向此块的指针指针指针指针void void*类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量类型的指针可以指向任意类型的变量6本讲稿第六页,共十页动态数组举例动态数组举例1动态一维数组动态一维数组2动态二维数组,但看成一维数组动态二维数组,但看成一维数组3动态二维数组动态二维数组7本讲稿第七页,共十页动态一维数组动态一维数组#include#include#include#includevoid main()void main()int i,n,int i,n,*p=NULL*p=NULL;pri
6、ntf(Please enter array size:);printf(Please enter array size:);scanf(%d,&n);scanf(%d,&n);p=(int*)malloc(n*sizeof(int);/p=(int*)malloc(n*sizeof(int);/根据上边输入的人数申请内存根据上边输入的人数申请内存根据上边输入的人数申请内存根据上边输入的人数申请内存printf(please input%d intergers,n);printf(please input%d intergers,n);for(i=0;in;i+)/for(i=0;in;i+)
7、/为动态数组输入数据为动态数组输入数据为动态数组输入数据为动态数组输入数据scanf(%d,scanf(%d,&pi&pi);/);/也可以用也可以用也可以用也可以用scanf(%d,scanf(%d,p+ip+i););puts(the array is:);puts(the array is:);for(i=0;in;i+)for(i=0;in;i+)printf(%4d,pi);printf(%4d,pi);free(p);/free(p);/释放申请的内存空间释放申请的内存空间释放申请的内存空间释放申请的内存空间 8本讲稿第八页,共十页动态二维数组,但看成一维数组来处理动态二维数组,但
8、看成一维数组来处理(通过列地址引用二维数组元素通过列地址引用二维数组元素)#include#include#include#includevoid main()void main()int i,j,m,n,*p=NULL;int i,j,m,n,*p=NULL;printf(Please enter size of row:);printf(Please enter size of row:);scanf(%d,&m);scanf(%d,&m);printf(Please enter size of line:);printf(Please enter size of line:);scanf
9、(%d,&n);scanf(%d,&n);p=(int*)calloc(n*m,sizeof(int);p=(int*)calloc(n*m,sizeof(int);/根据前边输入的行、列宽度申请内存空间根据前边输入的行、列宽度申请内存空间根据前边输入的行、列宽度申请内存空间根据前边输入的行、列宽度申请内存空间printf(please input%d intergers,m*n);printf(please input%d intergers,m*n);for(i=0;im;i+)for(i=0;im;i+)for(j=0;jn;j+)for(j=0;jn;j+)scanf(%d,scanf
10、(%d,&pi*n+j&pi*n+j););/为二维数组输入数据,但使用的是一维数组的引用形式为二维数组输入数据,但使用的是一维数组的引用形式为二维数组输入数据,但使用的是一维数组的引用形式为二维数组输入数据,但使用的是一维数组的引用形式puts(the array is:);puts(the array is:);for(i=0;im;i+)for(i=0;im;i+)for(j=0;jn;j+)for(j=0;jn;j+)printf(%4d,pi*n+j);printf(%4d,pi*n+j);putchar(n);putchar(n);free(p);/free(p);/释放释放释放释
11、放申请的内存空间申请的内存空间申请的内存空间申请的内存空间 9本讲稿第九页,共十页#include#include#include#includevoid main()void main()int i,j,m,n,*p=NULL,*Parray=NULL;int i,j,m,n,*p=NULL,*Parray=NULL;printf(Please enter size of row:);printf(Please enter size of row:);scanf(%d,&m);scanf(%d,&m);printf(Please enter size of line:);printf(Ple
12、ase enter size of line:);scanf(%d,&n);scanf(%d,&n);p=(int*)calloc(m,n*sizeof(int);/p=(int*)calloc(m,n*sizeof(int);/根据前边输入的行、列宽度申请内存空间根据前边输入的行、列宽度申请内存空间根据前边输入的行、列宽度申请内存空间根据前边输入的行、列宽度申请内存空间Parray=(int*)calloc(m,sizeof(int*);/Parray=(int*)calloc(m,sizeof(int*);/根据前边输入的行宽度申请一个指针数组要用的内存空间根据前边输入的行宽度申请一个指针
13、数组要用的内存空间根据前边输入的行宽度申请一个指针数组要用的内存空间根据前边输入的行宽度申请一个指针数组要用的内存空间 for(i=0;im;i+)/for(i=0;im;i+)/指针数组中存储二维数组每一行的首个元素的地址指针数组中存储二维数组每一行的首个元素的地址指针数组中存储二维数组每一行的首个元素的地址指针数组中存储二维数组每一行的首个元素的地址(列地址列地址列地址列地址)Parrayi=p+i*n;Parrayi=p+i*n;printf(please input%d intergers,m*n);printf(please input%d intergers,m*n);for(i=
14、0;im;i+)for(i=0;im;i+)for(j=0;jn;j+)for(j=0;jn;j+)scanf(%d,scanf(%d,(*(Parray+i)+j(*(Parray+i)+j);/);/为二维数组输入元素。指针数据名就相当于二维数组名为二维数组输入元素。指针数据名就相当于二维数组名为二维数组输入元素。指针数据名就相当于二维数组名为二维数组输入元素。指针数据名就相当于二维数组名puts(the array is:);puts(the array is:);for(i=0;im;i+)for(i=0;im;i+)for(j=0;jn;j+)for(j=0;jn;j+)printf(%4d,printf(%4d,ParrayijParrayij););putchar(n);putchar(n);free(p);/free(p);/释放内存空间释放内存空间释放内存空间释放内存空间free(Parray)free(Parray);动态二维数组动态二维数组(通过行地址引用二通过行地址引用二维数组元素维数组元素)P P列地址列地址列地址列地址ParrayParray行地址行地址行地址行地址&P0&P31 2 34 5 610本讲稿第十页,共十页