您好,欢迎访问三七文档
1第19讲指针数组教学目的与要求:掌握指针数组和指向指针的指针的使用了解带参数的main()函数教学内容提要:1.指针数组2.指针数组作main的参数3.有关指针的小结教学重点:指针数组和指向指针的指针的使用教学难点:指针数组和指向指针的指针的使用教学进度:P242~P2462一、指针数组指针数组:是指针变量的集合。即它的每一个元素都是指针变量,且都具有相同的存储类别和指向相同的数据类型。指针数组的定义形式为:类型标识符*数组名[数组长度说明];例如:int*p[10];由于[]比*的优先级高,因此p先与[10]结合成p[10],而p[10]正是数组的定义形式,共有10个元素。最后p[10]与*结合,表示它的各元素可以指向一个整型变量。3指针数组广泛应用于对字符串的处理例如有定义:char*p[3];定义了一个具有三个元素p[0],p[1],p[2]的指针数组。每个元素都可以指向一个字符数组,或字符串。若利用数组初始化,则:char*p[3]={“Basic”,“c++”,“pascal”};P[0]指向字符串“Basic”;P[0]指向字符串“c++”;P[0]指向字符串“pascal”;4charname[5][9]={“gain”,“much”,“stronger”,“point”,“bye”};char*name[5]={“gain”,“much”,“stronger”,“point”,“bye”};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二维数组存储空间固定字符指针数组相当于可变列长的二维数组分配内存单元=数组维数*2+各字符串长度指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量二维数组的行名是地址常量二维数组与指针数组区别:5例字符指针数组的赋值#defineNULL0main(){staticchara[]=“Fortran”;staticcharb[]=“COBOL”;staticcharc[]=“Pascal”;inti;char*p[4];p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;for(i=0;p[i]!=NULL;i++)printf(“Language%dis%s\n”,i+1,p[i]);}6例有若干本书,将书名按字典顺序排序#includestdio.h#includestring.hmain(){char*bname[]={ProgramminginANSIC,BASIC,VisualC++6.0Programming,TRUBOC2.0};inti,m;voidsort(char*name[],int);m=sizeof(bname)/sizeof(char*);/*字符串个数*/sort(bname,m);/*排序,改变指针的连接关系*/printf(\n);for(i=0;im;i++)/*输出排序结果*/printf(%8s,bname[i]);}7voidsort(char*name[],intn)/*选择排序*/{char*t;inti,j,k;/*k记录每趟最小值下标*/for(i=0;in-1;i++){k=i;for(j=i+1;jn;j++)if(strcmp(name[k],name[j])0)k=j;/*第j个元素更小*/if(k!=i)/*最小元素是该趟的第一个元素则不需交换*/{t=name[i];name[i]=name[k];name[k]=t;}}}输出结果为:BASICProgramminginANSICTRUBOC2.0VisualC++6.0Programming8注意:(1)字符数组中每个元素可存放一个字符,而字符指针变量存放字符串首地址,而不是存放在字符指针变量中。(2)对字符数组,与普通数组一样,不能对其进行整体赋值,只能给各个元素赋值,而字符指针变量可以直接用字符串常量赋值。例如,若有如下定义:chara[10];char*p;则语句a=”computer”;是非法的。只能对各个元素分别赋值:a[0]=’c’;a[1]=’o’;a[2]=’m’;a[3]=’p’;……;a[7]=’r’;但语句:p=”computer”;是合法的。9前面name是指针数组,元素均是指针数据,可定义一指针变量,指向数组,对数组各元素操作。如:char*name[4],**p;p=name;又如:p=name+2;printf(“%d,%d,%s”,p,*p,**p);输出:2004,3016,Greatwall200030162004例、使用指向指针的指针。main(){char*name[]={“Followme”,“BASIC”,“GreatWall”,“FORTRAN”,“ComputerDesign};char**p;inti;for(i=0;i<5;i++){p=name+i;printf(“%s\n,*p);}}11指针数组的元素也可以不指向字符串,而指向整型数据或实型数据,例如:inta[5]={1,3,5,7,9};int*num[5]={&[0],&[1],&[2],&[3],&[4]};int**p;此时为了得到数据5,可以先使p=num+2,然后输出**p。*p是p间接指向的对象的地址。而**p是p间接指向的对象的值。如图:例2一个指针数组的元素指向整型数据的简单例子。main(){staticinta[5]={1,3,5,7,9};int*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};int**p,i;p=num;for(i=0;i<5;i++){printf(%d\t,**p);p++;}}在以往的程序中,主函数main()都使用其无参形式。实际上,主函数main()也是可以指定形参的。[例]用同一程序实现文件的加密和解密。约定:程序的可执行文件名为lock.exe,其用法为:lock+|-被处理的文件名,其中“+”为加密,“-”为解密。二、指针数组作main函数的形参14main(intargc,char*argv[]){charc;if(argc!=3)printf(参数个数不对!\n);else{c=*argv[1];/*截取第二个实参字符串的第一个字符*/switch(c){case'+':/*执行加密*/{printf(执行加密程序段。\n);}break;case'-':/*执行解密*/{printf(执行解密程序段。\n);}break;default:printf(第二个参数错误!\n);}}}151.主函数main()的有参形式main(intargc,char*argv[]){……}2.实参的来源运行带形参的主函数,必须在操作系统状态下,输入主函数所在的可执行文件名,以及所需的实参,然后回车即可。命令行的一般格式为:[实参2……]例如,本例程序的用法:lock+|-被处理的文件名←┘●在TC的集成环境下,也可直接利用Options|Arguments项,输入主函数所需要的实参:只须输入各参数(相邻参数间用空格分开),可执行文件名可省略。就本案例而言,输入“+|-被处理的文件名”即可。163.形参说明(1)形参argc是命令行中参数的个数(可执行文件名本身也算一个)。在本例中,形参argc的值为3(lock、+|-、文件名)。(2)形参argv是一个字符指针数组,即形参argv首先是一个数组(元素个数为形参argc的值),其元素值都是指向实参字符串的指针。在本例中,元素argv[0]指向第1个实参字符串“lock”,元素argv[1]指向第2个实参字符串“+|-”,元素argv[2]指向第3个实参字符串“被处理的文件名”。17考察参数回送命令echo的内容,文件名为echo.cmain(argc,argv)intargc;char*argv[];{while(--argc0)printf(“%s%c”,*++argv,(argc1)?’‘:‘\n’);}运行,若输入:echoComputerandCLanguage回车则显示:ComputerandCLanguage三、有关指针运算的小结定义含义inti;int*p;inta[n];int*p[n];int(*p)[n];intf();int*p();int(*p)();int**p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量1、指针的数据类型192、指针运算小结1、指针变量加减一个整数如:p++p--p+ip-ip+=ip-=i等实际含义如p+i代表地址计算:p+c*i,c为字节数,整型c=2、实型c=4、字符型c=1。2、指针变量赋值如:p=&aa为变量,p为指针变量p=arrayarray为数组名p=&array[i]p=maxmax为函数名p1=p2p2为指针变量注意:不能把一个整数或常数赋给p,如p=1000同样也不能把p赋给整型变量,如i=p203、指针变量可以赋空值如:p=NULL;实际NULL是整数0。4、两个指针变量可以相减如两个指针变量指向同一个数组的元素(如右图),则p2-p1=4-1=3但p1+p2无意义。5、两个指针变量比较若两个指针指向同一个数组的元素,则可以比较,如:p1p2p1p2同样可以用(void*)p1将p1的值转换成void*类型。如:p2=(void*)p1;也可以将一个函数定义为void*类型,如:void*fun(charCh1,charCh2)如对函数调用得到的地址要进行以下转换:p1=(char*)fun(Ch1,Ch2);使用指针的优点:①提高程序效率;②在调用函数时变量改变了的值能够为主调函数使用,即可以从函数调用得到多个可改变的值;③可以实现动态存储分配。但是同时应该看到,指针使用实在太灵活,对熟练的程序人员来说,可以利用它编写出颇有特色的、质量优良的程序,实现许多用其他高级语言难以实现的功能,但也十分容易出错,而且这种错误往往难以发现。由于指针运用的错误甚至会引起使整个程序遭受破坏,比如由于未对指针淞縫赋值就向*p赋值,这就可能破坏了有用的单元的内容。有人说指针是有利有弊的工具,甚至说它“好坏参半”。的确,如果使用指针不当,特别是赋予它一个错误的值时,会成为一个极其隐蔽的、难以发现和排除的故障。因此,使用指针要十分小心谨慎,要多上机调试程序,以弄清一些细节,并积累经验。23小结1、指针数组的表示形式和使用2、指向指针的指针的使用•作业:
本文标题:c语言教案第19讲
链接地址:https://www.777doc.com/doc-3377427 .html