语言第十三讲.pptx
例1 1:输出字符串#includevoidmain()chars=“hello”,*ps;ps=s;while(*ps!=0)putchar(*ps);ps+;main()charstr80,*p,ch;inti=0;p=str;gets(p);ch=getchar();for(;*p!=0;p+)if(*p!=ch)stri+=*p;stri=0;printf(“Thenewstringis:%sn”,str);例2 2:在输入的字符串中删除指定的字符2000Hp str0 str1 str202000H2001H2002H2003H2004H2005H2006Hch0i运行程序:abcdefc 2000Hstr a b d e f0 a b c d e fcstrprintf(“%s”,ps);或:puts(ps)Thenewstringis:abdef第1页/共18页字符指针(变量)与字符数组的区别字符指针与字符数组:两者均可存储和运算字符串。两者均可存储和运算字符串。主要区别:存储格式不同:字符指针变量中存放的是字符指针变量中存放的是字符串的首地址字符串的首地址(2字节字节);而字符数;而字符数组中存放的是组中存放的是整个字符串整个字符串(一个数组元素存放一个字符)。一个数组元素存放一个字符)。性质不同:字符数组名是地址常量,不能改变字符数组名是地址常量,不能改变(指向首字符指向首字符););字符指针是地字符指针是地址变量,可以改变址变量,可以改变(指向不同的字符指向不同的字符)。赋值方式不同:字符指针 char*ps=“Hello”;char*ps;ps=“Hello”;字符数组charst=“Hello”;charst80;st=“Hello”或:st=“Hello”用循环逐个赋值或用strcpy()函数赋值第2页/共18页例:统计字符串中的各元音字母的个数(P182例6.15)#includevoidmain(void)charstr80,*p;inta=0,e=0,i=0,o=0,u=0;gets(str);for(p=str;*p!=0;p+)switch(*p)casea:caseA:a+;break;casee:caseE:e+;break;casei:caseI:i+;break;caseo:caseO:o+;break;caseu:caseU:u+;printf(a:%3dne:%3dni:%3dno:%3dnu:%3dn,a,e,i,o,u);循环遍历数组元素 判断字母。判断字符串是否结束判断字符串是否结束第3页/共18页2.字符串指针做函数参数(见P183表6-2)#includevoidcpystr(char*s1,char*s2)while(*s2!=0)*s1+=*s2+;*s1=0;voidmain(void)charstr120,str2=123456abcdef;cpystr(str1,str2);printf(str2:%sn,str2);printf(str1:%sn,str1);去掉该句,对程序结果是否有影响?例:编写函数,用指针进行字符串的复制,第4页/共18页6.2.4指针数组 指针是存放其它数据对象地址的指针是存放其它数据对象地址的变量变量。也可以构成。也可以构成数组数组。每个数组元素均为一个。每个数组元素均为一个指针变量,且在内存中连续存放。指针变量,且在内存中连续存放。1.指针数组定义格式:type*数组名数组名元素个数元素个数;int*p4;定义(说明)定义(说明)p是含有是含有4个元素的指针变量,每个元素都是个元素的指针变量,每个元素都是一个指向整型变量的指针一个指向整型变量的指针(二级指针)(二级指针)。p0p1p2p3数组名数组名p为数组的首地址。为数组的首地址。使用前必须让各元素指向对象。使用前必须让各元素指向对象。inti,a34,*p3;for(i=0;i3;i+)pi=ai;*(pi+j)=2;/*通过指针数组引用数组元素aij*/第5页/共18页2、用指针数组处理多字符串例:用指针数组对字符串进行排序。例:用指针数组对字符串进行排序。#includevoidmain(void)inti,j;char*ps=Get,Put,Time,Date,*p;printf(排序前字符串:n);for(i=0;i4;i+)puts(psi);for(i=0;i3;i+)for(j=i+1;j0)p=psi;psi=psj;psj=p;printf(排序后字符串:n);for(i=0;i4;i+)puts(psi);循循环环实实现现排排序序Get0Put0Time0Date0ps0ps1ps2ps3ps第6页/共18页2 2、指针数组访问二维数组通过指针数组输出数组元素的值通过指针数组输出数组元素的值,分析运行结果。分析运行结果。#includevoidmain()inti,j;inta33=1,2,3,4,5,6,7,8,9;int*pa3=a0,a1,a2;int*p=a0;for(i=0;i3;i+)for(j=0;j3;j+)printf(%5d,paij);printf(n);for(i=0;i3;i+)printf(%d,%d,%dn,ai2-i,*ai,*(*(a+i)+i);for(i=0;i=y?x:y);2400H函数指针变量的定义:type(*p)();函数的类型。函数的类型。指针变量名指针变量名函数函数使用步骤:定义函数定义函数fname和指向函数的指针和指向函数的指针p;指针指向函数;指针指向函数;p=fname;通过指针引用函数。通过指针引用函数。格式:格式:(*p)(实参表实参表);main()第8页/共18页举例:求举例:求a、b的最大值。的最大值。#includeintlmax(int,int);voidmain(void)inta,b,c;int(*funp)();funp=lmax;scanf(“%d,%d”,&a,&b)c=(*funp)(a,b);printf(“Max.is%dn”,c);intlmax(intx,inty)return(xy?x:y);说明指向函数的指针。说明指向函数的指针。指针指向函数。指针指向函数。funplmax通过指针引用函数。通过指针引用函数。lmax2100H2100H第9页/共18页6.3.2返回指针的函数返回指针的函数概念:概念:函数可以返回一个值,也可以返回一个地址(指针),如果函数返回函数可以返回一个值,也可以返回一个地址(指针),如果函数返回指针,称为指针,称为返回指针的函数。返回指针的函数。定义:定义:type*函数名(形参表)函数名(形参表)/*函数体函数体*/int*max(inta,intb)注意:int(*p)()和int*p()的区别:int(*p)()是定义一个变量(p是一个指向函数入口的指针变量);int*p()则是定义一个函数(p是一个返回值为指针的函数),它还有函数体部分。第10页/共18页例:输入一个17之间的整数,输出对应的星期名。char*day_name(intn)char*name=“Illegalday”,”Monday”,”Tuesday”,”Wednesday”,“Thursday”,”Friday”,”Saturday”,”Sunday”;return(n7)?name0:namen);#includemain()inti;printf(“InputDayNo:n”);scanf(“%d”,&i);if(i%sn”,i,day_name(i);定义一个指针型函数,其返回值指向一个字符串形参n为星期名对应的整数exit为一库函数,exit(1)有错退出程序,exit(0)正常退出name为一指针数组,每个元素均为指针变量。运行结果:InputDayNo:2DayNo:2-Tuesday第11页/共18页6.3.3main函数的参数函数的参数如DOS命令:C:testaabbcc可执行文件名可执行文件名命令参数命令参数主函数主函数main()也可以带参数,由于也可以带参数,由于main()不能被其他函数调用,故无法在程序不能被其他函数调用,故无法在程序内部取得实参值。它的参数来自内部取得实参值。它的参数来自dos提示符命令行提示符命令行(如用命令行运行编译连接好的如用命令行运行编译连接好的.exe文件文件),实参就是命令行输入的字符串。,实参就是命令行输入的字符串。主函数一般有两个参数。主函数一般有两个参数。voidmain(intargc,char*argv)(函数体)整型变量。存放命令行整型变量。存放命令行字符串的个数字符串的个数(以空格分隔以空格分隔)。指向字符的指针数组。分指向字符的指针数组。分别存放各字符串参数的地址。别存放各字符串参数的地址。第12页/共18页举例:编程显示命令行输入的参数。举例:编程显示命令行输入的参数。#includevoidmain(intargc,char*argv)inti;printf(argc=%dn,argc);for(i=0;iargc 4argv0argv1argv2argv3test0How0are0you?0第13页/共18页*举例:在字符串中查找特定的字符。举例:在字符串中查找特定的字符。#include#includechar*lstrchar(char*,char);voidmain(void)charc,*p,str80;gets(str);scanf(“%c”,&c);p=lstrchar(str,c);if(p=NULL)printf(“char%cnotfoundn”,c);elseprintf(“Thepositionis%d”,p-str);char*lstrchar(char*s,charch)char*chp=NULL;while(*s+!=0)if(*s=ch)chp=s;break;returnchp;返回指针的函数。返回指针的函数。指向空!指向空!第14页/共18页 课堂作业:#includemain()inti;chars5,*p;for(i=0;is;p-)printf(%s,%cn,p,*p);写出下列程序运行结果。#includeintf(int*a,intn)if(n1)return*a+f(a+1,n-1);elsereturn*a;voidmain()intaa10=1,2,3,4,5,6,7,8,9,10,s;s=f(aa+1,4);printf(%dn,s);第15页/共18页 思考题:作业题:作业题:p188习题习题一、选择题一、选择题720。二、填空题二、填空题47。三、程序运行题三、程序运行题13。四、程序填空题四、程序填空题2、4。五、程序设计题五、程序设计题2、3、6。上机验证上机验证p178例例6.19,分析,分析行指针定义行指针定义(*p)n和和指针数组定义指针数组定义*pn的异同的异同点,进一步理解和记忆二维数组中数组元素和其地址的表示方法。点,进一步理解和记忆二维数组中数组元素和其地址的表示方法。第16页/共18页编程题:#include#defineN3voidss(intc3,int*s1,int*s2);voidmain(void)intaNN,bN;inti,j,k,sum1,sum2;for(i=0;iN;i+)for(j=0;jN;j+)scanf(%d,&aij);ss(a,&sum1,&sum2);printf(%d,%dn,sum1,sum2);voidss(intc3,int*s1,int*s2)inti,(*p)3;p=c;*s1=*s2=0;for(i=0;iN;i+)*s1+=pii;*s2+=pi2-i;用指针编写函数分别求二维方阵主、辅对角线上元素的和sum1和sum2。要求:在主函数中输入a44,通过函数用指针求a44主、辅对角线元素的和。见ktzyss.c第17页/共18页感谢您的观看!第18页/共18页