资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,/42,c语言第十一章(苏小红版),11.1,指针和一维数组间的关系,int,a4=1,2,3,4;,0,x0037b000,a0,0,x0037b004,0,x0037b008,0,x0037b00B,a,.,.,1,int,*,pa=a;,pa,int,*,pa=,2,3,4,a1,a2,a3,数组名是一个常量指针,不能修改该指针的指向,指针可当数组名使用,11.1,指针和一维数组间的关系,int,a4=1,2,3,4;,0,x0037b000,a0,0,x0037b004,0,x0037b008,0,x0037b00B,a,.,.,1,int,*,pa=a;,pa,int,*,pa=,2,3,4,a1,a2,a3,数组元素的等价引用形式,ai,*(a+i),pai,*(pa+i),a+1,*(a+1),pa0,*(pa+2),pa+2,*pa,11.1,指针和一维数组间的关系,int,a4=1,2,3,4;,0,x0037b000,a0,0,x0037b004,0,x0037b008,0,x0037b00B,a,.,.,1,p,2,3,4,a1,a2,a3,for,(i=0;i4;i+),scanf(%d,for,(i=0;i4;i+),printf(%d,ai);,for,(p=a;p(a+4);p+),scanf(%d,p);,for,(p=a;p(a+4);p+),printf(%d,*p);,*p,*p,a+4,11.1,指针和一维数组间的关系,【,例,11.1】,演示数组元素的引用方法,11.1,指针和一维数组间的关系,【,例,11.1】,演示数组元素的引用方法,11.1,指针和一维数组间的关系,【,例,11.2】,演示数组和指针变量作函数参数,被调函数的形参声明为数组类型,用下标法访问数组元素,11.1,指针和一维数组间的关系,【,例,11.2】,演示数组和指针变量作函数参数,被调函数的形参声明为指针,类型,,用指针法访问数组元素,11.1,指针和一维数组间的关系,【,例,11.2】,演示数组和指针变量作函数参数,在主函数中这样做没有多大的实际意义,11.2,指针和二维数组间的关系,可将二维数组看做一维数组,其每个数组元素又是一个一维数组,按行顺序存放所有元素,a00,a01,a02,a10,a11,a12,a0,a1,a0,+1,a0,+2,&,a0,0,&,a1,0,&,a1,1,a1,+1,&,a1,2,&,a0,1,&,a0,2,a00,a0,a01,a02,a10,a1,a11,a12,a,a1,+2,short,a23;,a,a,+1,11.2,指针和二维数组间的关系,a00,a01,a02,a10,a11,a12,a00,a0,a01,a02,a10,a1,a11,a12,a,short,a23;,a,a,+1,a,代表,二,维数组的首地址,,第,0,行,的地址,,行地址,a+i,代表,第,i,行,的地址,但并非增加,i,个字节!,a00,a01,a02,a10,a11,a12,a0,a1,&,a0,0,&,a1,0,a00,a0,a01,a02,a10,a1,a11,a12,a,short,a23;,*,(a,+i),即,ai,代表,第,i,行,第,0,列,的地址,,,列地址,a,a,+1,*,(a,+i)+j,即,ai+j,代表,第,i,行,第,j,列,的地址,&aij,&,a1,2,a1,+2,11.2,指针和二维数组间的关系,a00,a01,a02,a10,a11,a12,a0,a1,&,a0,0,&,a1,0,a00,a0,a01,a02,a10,a1,a11,a12,a,short,a23;,a,a,+1,&,a1,2,a1,+2,*,(*(a,+i)+j),即,aij,代表,第,i,行第,j,列,的,内容,*,(a,+i),即,ai,代表,第,i,行,第,0,列,的地址,,,列地址,*,(a,+i)+j,即,ai+j,代表,第,i,行,第,j,列,的地址,&aij,11.2,指针和二维数组间的关系,二维数组的,行,指针,int,(,*,p)3;,p=a;,/,用行地址初始化,逐行查找,-,逐列查找,p,short,a23;,a00,a01,a02,a10,a11,a12,a,a+1,11.2,指针和二维数组间的关系,二维数组的,行,指针,int,(,*,p)3;,p=a;,/,用行地址初始化,逐行查找,逐列查找,p,short,a23;,a00,a01,a02,a10,a11,a12,a+1,a,11.2,指针和二维数组间的关系,二维数组的,行,指针,int,(,*,p)3;,p=a;,/,用行地址初始化,逐行查找,-,逐列查找,for,(i=0;im;i+),for,(j=0;jn;j+),printf(,%d,*(*(p+i)+j),);,short,a23;,a00,a01,a02,a10,a11,a12,p,a,a+1,11.2,指针和二维数组间的关系,二维数组的,列,指针,int,*,p;,p=,*,a;,/,用列地址初始化,逐个查找,相对偏移量,for,(i=0;im;i+),for,(j=0;jn;j+),printf(,%d,*(p+,i*n+j,),);,p,short,a23;,a00,a01,a02,a10,a11,a12,*a,或,a0,p,i*n+j,11.2,指针和二维数组间的关系,【,例,11.3】,输入一个,3,行,4,列的二维数组,然后输出这个二维数组的元素值,11.2,指针和二维数组间的关系,【,例,11.3】,输入一个,3,行,4,列的二维数组,然后输出这个二维数组的元素值,11.2,指针和二维数组间的关系,形参声明为列数已知的二维数组,【,例,11.3】,输入一个,3,行,4,列的二维数组,然后输出这个二维数组的元素值,11.2,指针和二维数组间的关系,形参声明为指向列数已知的二维数组的行指针,【,例,11.3】,输入一个,3,行,4,列的二维数组,然后输出这个二维数组的元素值,11.2,指针和二维数组间的关系,形参声明为指向二维数组的列指针,【,例,11.3】,输入一个,3,行,4,列的二维数组,然后输出这个二维数组的元素值,11.2,指针和二维数组间的关系,指针和数组作函数参数,通过指针或数组参数,使调用者获得修改后的数据,通过一个参数把大量的数据送到函数内,如果只向内传送数据,就把参数定义为,const,,防止意外修改数据,也让函数的功能更明确,void,PrintArray(,const,int*,p,int,n).,void,PrintArray(,const,int,a,int,n).,指针、数组以及其他的类型混合,基本数据类型,int,、,long,、,char,、,short,、,float,、,double,数组是一种数据类型,是从其他类型派生的类型,每个元素都有一个类型,指针是一种数据类型,是从其他类型派生的类型,XX,类型的指针,任何类型都可以作指针或者数组的,基类型,11.3,指针数组及其应用,用指针作数组的基类型,?,指针数组,(,Pointer Array,),元素均为指针类型数据的数组,定义形式为:,数据类型 *,数组名,数组长度,;,例如,char*,ptr5;,ptr,5,*,char,【,例,10.4】,国名,字符串排序,二维数组,char,name,N,MAX_LEN,;,.,for,(i=0;in-1;i+),for,(j=i+1;jn;j+),if,(,strcmp(strj,stri)0,),strcpy(temp,stri);,strcpy(stri,strj);,strcpy(strj,temp);,MAX_LEN,N,交换字符数组中的字符串,物理排序,【,例,11.4】,国名,字符串排序,指针数组,char,*ptrN;,.,for,(i=0;in-1;i+),for,(j=i+1;jn;j+),if,(,strcmp(ptrj,ptri)1),为指向每个参数的字符指针,【,例,11.5】,演示命令行参数与,main,函数各形参之间的关系,int,main(int argc,char*argv),int,i;,printf(The number of command line arguments is:%dn,argc);,printf(The program name is:%sn,argv0);,if,(argc 1),printf(The other arguments are following:n);,for,(i=1;i 1),printf(The other arguments are following:n);,for,(i=1;i,argc,;i+),printf(%sn,argvi,);,return 0;,The number of command line arguments is:4,The program name is:,echo.exe,The other arguments are following:,programming,is,fun,11.4,动态数组,11.4.1 C,程序的内存映像,C,程序中变量的内存分配方式,从静态存储区分配,全局变量和静态变量,在栈上创建,存放函数参数值、局部变量值等,在执行函数调用时,系统在栈上为函数内的局部变量及形参分配内存,函数执行结束时,自动释放这些内存,从堆上分配,在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的,动态内存的生存期由程序员自己来决定,11.4.2,动态内存分配函数,Two primary methods of allocating memory:,void*,malloc(,unsigned,int,size);,void*,calloc(,unsigned int,num,unsigned,int,size);,#,include,#,include,void*,类型的指针可以指向任意类型的变量,通常强转,(Type*),为其他类型,11.4.2,动态内存分配函数,Two primary methods of allocating memory:,void,*malloc(,unsigned,int,size);,void,*calloc(,unsigned int,num,unsigned,int,size);,向系统申请大小为,size,的内存块,把首地址返回,若申请不成功则返回,NULL,向系统申请num个size大小的内存块,把首地址返回,若申请不成功则返回NULL,11.4.2,动态内存分配函数,void,*,free(,void,*p);,释放由,malloc(),和,calloc(),申请的内存块,p,是指向此块内存的指针,free,时系统标记此块内存为未占用,可被重新分配,Method of deallocating memory:,p,n,确保指针使用前是非空指针,释放向系统申请的存储空间,11.4.3,长度可变的一维动态数组,【,例,11.6】,一维动态数组,p,n,像使用一维数组一样,使用动态数组,11.4.3,长度可变的一维动态数组,【,例,11.6】,一维动态数组,确保指针使用前是非空指针,释放向系统申请的存储空间,p,m*n,11.4.4【,例,11.7】,二维动态数组,仍当,做,一维数组来使用,p,m*n,11.4.4【,例,11.7】,二维动态数组,Questions and answers,此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢,
展开阅读全文