指针详细讲解课件.ppt

上传人(卖家):三亚风情 文档编号:3326169 上传时间:2022-08-20 格式:PPT 页数:77 大小:1.11MB
下载 相关 举报
指针详细讲解课件.ppt_第1页
第1页 / 共77页
指针详细讲解课件.ppt_第2页
第2页 / 共77页
指针详细讲解课件.ppt_第3页
第3页 / 共77页
指针详细讲解课件.ppt_第4页
第4页 / 共77页
指针详细讲解课件.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

1、Chap 8 指针指针 8.1 密码开锁密码开锁 8.2 角色互换角色互换 8.3 冒泡排序冒泡排序 8.4 电码加密电码加密 8.5 任意个整数求和任意个整数求和*本章要点本章要点n变量、内存单元和地址之间是什么关系?变量、内存单元和地址之间是什么关系?n如何定义指针变量,怎样才能使用指针变量?如何定义指针变量,怎样才能使用指针变量?n什么是指针变量的初始化?什么是指针变量的初始化?n指针变量的基本运算有哪些?如何使用指针指针变量的基本运算有哪些?如何使用指针操作所指向的变量?操作所指向的变量?n指针作为函数参数的作用是什么?指针作为函数参数的作用是什么?n如何使用指针实现函数调用返回多个值

2、?如何使用指针实现函数调用返回多个值?n如何利用指针实现内存的动态分配?如何利用指针实现内存的动态分配?8.1 密码开锁密码开锁 一个一个密室逃脱游戏密室逃脱游戏中的密码开锁:中的密码开锁:2626个寄存箱,每个寄存箱个寄存箱,每个寄存箱上按顺序都有一个英文字母和一个编号,字母从上按顺序都有一个英文字母和一个编号,字母从A A到到Z Z,编号,编号从从0101到到2626关键点分析关键点分析n得到线索:得到线索:找到一把钥匙,打开找到一把钥匙,打开p寄存箱(编号为寄存箱(编号为16)n提示地址:提示地址:里面是一把刻着数字里面是一把刻着数字24的钥匙的钥匙n找到目标:找到目标:打开编号为打开编

3、号为24的的X寄存箱寄存箱n取出内容:取出内容:“5342”8.1 寻找密码的途径分析寻找密码的途径分析n密码存放需要一定的存储空间作为存放地,每密码存放需要一定的存储空间作为存放地,每个存放地都会有地址个存放地都会有地址 n如果知道了存放地的名字,当然能够找到密码如果知道了存放地的名字,当然能够找到密码n如果不知道存放地的名字,知道该存放地的地如果不知道存放地的名字,知道该存放地的地址也能够取出密码址也能够取出密码 n如果有另外一个地方存放了该密码存放地的地如果有另外一个地方存放了该密码存放地的地址,那么就能顺藤摸瓜,间接找到密码址,那么就能顺藤摸瓜,间接找到密码8.1 密码存放示意图密码存

4、放示意图534224p2416名字名字px地址地址1624内容内容245342x例例8-1 利用指针模拟利用指针模拟密码开锁游戏密码开锁游戏获取密码的两种方法获取密码的两种方法:#include int main(void)int x=5342;/*变量变量x用于存放密码值用于存放密码值5342*/int*p=NULL;/*定义整型指针变量定义整型指针变量p,NULL值为值为0,代表空指针,代表空指针*/p=&x;/*将变量将变量x的地址存储在的地址存储在p中中*/*通过变量名通过变量名x输出密码值输出密码值*/printf(If I know the name of the variable

5、,I can get its value by name:%dn,x);/*通过变量通过变量x的地址输出密码值的地址输出密码值*/printf(If I know the address of the variable is:%x,then I also can get its value by address:%dn,p,*p);return 0;If I know the name of the variable,I can get its value by name:5342If I know the address of the variable is:12ff7c,then I al

6、so can get its value by address:53428.1.2 地址和指针地址和指针指针指针的的概念概念 内存单元内存单元地址地址 内容内容 变量变量int x=20,y=1,z=155;printf(%d,x;)直接访问直接访问:通过变量名访问:通过变量名访问间接访问间接访问:通过通过另一个变量访另一个变量访问问把变量的地址放到另一变量中把变量的地址放到另一变量中使用时先找到后者使用时先找到后者再再从中取出前者的地址从中取出前者的地址1000 20 x1002 1 y1004 155 z2000 1000 p2002地址地址 指针变量指针变量指针指针 内存单元内存单元地址

7、地址 内容内容 变量变量int x=20,y=1,z=155;printf(%d,x;)1000 20 x1002 1 y1004 155 z2000 1000 p2002地址地址 指针变量指针变量指针变量指针变量:存放地址的变量:存放地址的变量某个某个变量变量的地址的地址指向指向指针变量所指向的变量的类型指针变量所指向的变量的类型int *p;p 是整型指针,指向整型变量是整型指针,指向整型变量float*fp;fp 是浮点型指针,指向浮点型变量是浮点型指针,指向浮点型变量char*cp;cp 是字符型指针,指向字符型变量是字符型指针,指向字符型变量类型名类型名 *指针变量名指针变量名指针声

8、明符指针声明符8.1.3 指针变量的定义指针变量的定义指针变量的定义指针变量的定义类型名类型名 *指针变量名指针变量名int *p;指针变量名是指针变量名是 p,不是不是*p*是指针声明符是指针声明符int k,*p1,*p2;等价于:等价于:int k;int *p1;int *p2;定义多个指针变量时,每一个指针变量定义多个指针变量时,每一个指针变量前面都必须加上前面都必须加上*8.1.4 指针的基本运算指针的基本运算*间接访问运算符间接访问运算符,访问指针所指向的变量访问指针所指向的变量*p:指针变量指针变量 p 所所指向的指向的变量变量a3&ap*p如果指针的值是某个变量的地址,通过指

9、针就如果指针的值是某个变量的地址,通过指针就能能间接访问间接访问那个变量。那个变量。1、取地址运算和间接访问运算、取地址运算和间接访问运算&取地址运算符取地址运算符,给出变量的地址给出变量的地址int*p,a=3;p=&a;把把 a 的地址赋给的地址赋给 p,即即 p 指向指向 a指针变量的类型和它所指向变量的类型相同指针变量的类型和它所指向变量的类型相同#include int main(void)int a=3,*p;p=&a;printf(“a=%d,*p=%dn”,a,*p);*p=10;printf(a=%d,*p=%dn,a,*p);printf(Enter a:);scanf(%

10、d,&a);printf(a=%d,*p=%dn,a,*p);(*p)+;printf(a=%d,*p=%dn,a,*p);return 0;例例8-2指针取地址运算和间接访问运算指针取地址运算和间接访问运算 a3&ap*pa=3,*p=3a=10,*p=10Enter a:5 a=5,*p=5a=6,*p=6 a3&ap*p(1)当当 p=&a 后,后,*p 与与 a 相同相同(2)int*p;定义定义指针指针变量变量 p *p=10;指针指针p所指所指向向的变量的变量,即即a(3)&*p 与与&a 相同,相同,是是地址地址 *&a 与与 a 相同,相同,是是变量变量(4)(*p)+等价于等

11、价于 a+将将 p 所指所指向向的变量值加的变量值加1 *p+等价于等价于*(p+)先取先取*p,然后然后 p 自加,自加,此时此时p不再指向不再指向a说明说明 int a=1,x,*p;p=&a;x=*p+;2、赋值运算、赋值运算a3&ap1&ap2*p1*p2int a=3,*p1,*p2;p1=&a;把把 a 的地址赋给的地址赋给 p1,即即 p1 指向指向 ap2=p1;p2 也指向也指向 a相同类型的指针才能相互赋值相同类型的指针才能相互赋值1)指针变量在定义后也要先赋值再引用指针变量在定义后也要先赋值再引用 2)在定义指针变量时,可以同时对它赋初值在定义指针变量时,可以同时对它赋初

12、值 int a;int*p1=&a;int*p2=p1;3)不能用数值作为指针变量的初值,但可以将一不能用数值作为指针变量的初值,但可以将一 个指针变量初始化为一个空指针个指针变量初始化为一个空指针 int*p=1000;p=0;p=NULL;p=(int*)1732;8.1.5 指针指针变量变量的的初始化初始化使用强制类型转换使用强制类型转换(int*)来避免编译错误,不提倡来避免编译错误,不提倡8.2 角色互换角色互换如何通过函数调用实现代表如何通过函数调用实现代表2 2个角色的变量互个角色的变量互相相三套方案三套方案nswap1()swap1()nswap2()swap2()nswap3

13、()swap3()哪个方案能成功?哪个方案能成功?例例8-3 指针作为函数参数模拟角色互换指针作为函数参数模拟角色互换int main(void)int a=1,b=2;int*pa=&a,*pb=&b;void swap1(int x,int y),swap2(int*px,int*py),swap3(int*px,int*py);swap1(a,b);printf(“After calling swap1:a=%d b=%dn”,a,b);a=1;b=2;swap2(pa,pb);printf(“After calling swap2:a=%d b=%dn”,a,b);a=1;b=2;sw

14、ap3(pa,pb);printf(“After calling swap3:a=%d b=%dn”,a,b);return 0;调用哪个函数,可以交换调用哪个函数,可以交换main()中变量中变量a和和b的值的值?例例8-3 swap1()swap1(a,b);void swap1(int x,int y)int t;t=x;x=y;y=t;例例8-3 swap2()swap2(&a,&b);void swap2(int*px,int*py)int t;t=*px;*px=*py;*py=t;例例8-3 swap3()swap3(&a,&b);void swap3(int*px,int*py

15、)int*pt;pt=px;px=py;py=pt;After calling swap1:a=1,b=2After calling swap2:a=2,b=1After calling swap3:a=1,b=28.2.2 指针作为函数参数指针作为函数参数n函数参数包括函数参数包括实参实参和和形参形参,两者的类型要,两者的类型要一致一致,可以是指针类型可以是指针类型n如果如果实参实参是某个变量的是某个变量的地址地址,相应的,相应的形参形参就是就是指针指针n在在C语言中实参和形参之间的数据传递是语言中实参和形参之间的数据传递是单单向向的的“值传递值传递”方式方式 例例8-3 swap1()a1

16、2bx12y21swap1(a,b);void swap1(int x,int y)int t;t=x;x=y;y=t;在在swap1()函数中改变了形参函数中改变了形参x,y的值的值但不会反过来影响到实参的值但不会反过来影响到实参的值 swap1()不能改变不能改变main()函数中实参函数中实参a和和b的值的值 例例8-3 swap2()swap2(&a,&b);void swap2(int*px,int*py)int t;t=*px;*px=*py;*py=t;abpxpy12值传递,地址未变,值传递,地址未变,但存放的变量的值改变了但存放的变量的值改变了21在在swap2()函数中交换

17、函数中交换*px和和*py的值,主的值,主调函数中调函数中a和和b的值也相应交换了的值也相应交换了 例例8-3 swap3()swap3(&a,&b);void swap3(int*px,int*py)int*pt;pt=px;px=py;py=pt;abpxpy12值传递,形参指针的改变值传递,形参指针的改变不会影响实参不会影响实参swap3()中直接交换了形参指针中直接交换了形参指针px和和py的值的值 指针指针作为函数参数的应作为函数参数的应用用swap2(&a,&b);void swap2(int*px,int*py)int t;t=*px;*px=*py;*py=t;要通过函数调用来

18、改变主调函数中某个变量的值:要通过函数调用来改变主调函数中某个变量的值:(1)在主调函数中,在主调函数中,将该变量的地址或者指向该变量的将该变量的地址或者指向该变量的指针作为实参指针作为实参(2)在被调函数中,在被调函数中,用指针类型形参接受该变量的地址用指针类型形参接受该变量的地址(3)在被调函数中,改变形参所指向变量的值在被调函数中,改变形参所指向变量的值abpxpy1221After calling swap1:a=1,b=2After calling swap2:a=2,b=1After calling swap3:a=1,b=2通过指针实现函数调用返回多个值通过指针实现函数调用返回多

19、个值 例例8-4 输入年和天数,输出对应的年、月、日。输入年和天数,输出对应的年、月、日。例如:输入例如:输入2000和和61,输出,输出2000-3-1。定义函数定义函数month_day(year,yearday,*pmonth,*pday)用用2个指针作为函数的参数,带回个指针作为函数的参数,带回2个结果个结果int main(void)int day,month,year,yearday;void month_day(int year,int yearday,int*pmonth,int*pday);printf(“input year and yearday:”);scanf(%d%

20、d,&year,&yearday);month_day(year,yearday,&month,&day);printf(%d-%d-%d n,year,month,day);return 0;例例8-4void month_day(int year,int yearday,int*pmonth,int*pday)int k,leap;int tab 213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31,;/*建立闰年判别条件建立闰年判别条件leap*/leap=(year%4=0&yea

21、r%100!=0)|year%400=0;for(k=1;yearday tableapk;k+)yearday=yearday-tab leapk;*pmonth=k;*pday=yearday;input year and yearday:2000 61 2000-3-1 monthdaypmonthpday318.3 冒泡排序冒泡排序-程序解析程序解析 void bubble(int a,int n);int main(void)int n,a8;int i;printf(Enter n(n=8):);scanf(%d,&n);printf(Enter a%d:,n);for(i=0;i

22、n;i+)scanf(%d,&ai);bubble(a,n);printf(After sorted,a%d=,n);for(i=0;in;i+)printf(%3d,ai);return 0;void bubble(int a,int n)int i,j;for(i=1;i n;i+)for(j=0;j aj+1)t=aj;aj=aj+1;aj+1=t;Enter n(n=8):8Enter a8:7 3 66 3-5 22-77 2After sorted,a8=-77-5 2 3 3 7 22 66 8.3.2 数组和地址间的关系数组和地址间的关系int a100,*p;数组名代表一个地

23、数组名代表一个地址,它的值是数址,它的值是数组首元素的地址组首元素的地址(基地址)(基地址)a+i 是距数组是距数组a的的基地址的第基地址的第i个偏个偏移移3000 a0地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+i&ai*(a+i)sum=0;for(i=0;i 100;i+)sum=sum+ai ;*(a+i)下标运算符下标运算符 的含义的含义指针和数组的关系指针和数组的关系任何由数组下标来实现的操作都能用指针来任何由数组下标来实现的操作都能用指针来完成完成int a100,*p;p=a;或或p=&a0;pp+1p+99p+i3000 a0

24、地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+i&ai aia+i *(a+i)p+i *(p+i)&pi pip=a;sum=0;for(i=0;i 100;i+)sum=sum+pi;等价等价等价等价用指针完成对数组的操作用指针完成对数组的操作int a100,*p;移动指针移动指针 p3000 a0地址地址 内容内容 数组元素数组元素3002 a13198 a99 ai aa+1a+99a+isum=0;for(p=a;p=&a99;p+)sum=sum+*p;p p p#include int main(void)double a2,*p

25、,*q;p=&a0;q=p+1;printf(%dn,q-p);printf(%dn,(int)q-(int)p);return 0;例例8-6 使用指针计算数组元素个数和使用指针计算数组元素个数和数组元素的存储单元数数组元素的存储单元数 18指针指针p p和和q q之间元素的个数之间元素的个数指针指针p p和和q q之间的字节数之间的字节数地址值地址值 pq3000 a0地址地址 内容内容 数组元素数组元素3008 a1 aa+1double *p,*q;nq-p两个相同类型的指针相减,表示它们之间相隔的存储单元两个相同类型的指针相减,表示它们之间相隔的存储单元的数目的数目np+1/p-1指

26、向下一个存储单元指向下一个存储单元/指向上一个存储单元指向上一个存储单元n其他操作都是非法的其他操作都是非法的指针相加、相乘和相除,或指针加上和减去一个浮点数指针相加、相乘和相除,或指针加上和减去一个浮点数np q两个相同类型指针可以用关系运算符比较大小两个相同类型指针可以用关系运算符比较大小指针的算术运算和比较运算指针的算术运算和比较运算 pq3000 a0地址地址 内容内容 数组元素数组元素3008 a1 aa+1int main(void)int i,a10,*p;long sum=0;printf(Enter 10 integers:);for(i=0;i 10;i+)scanf(%d

27、,&ai);for(i=0;i 10;i+)sum=sum+ai;printf(calculated by array,sum=%ld n,sum);sum=0;for(p=a;p=a+9;p+)sum=sum+*p;printf(calculated by pointer,sum=%ld n,sum);return 0;例例8-7 分别使用数组和指针计算数组元素之和分别使用数组和指针计算数组元素之和 Enter 10 integers:10 9 8 7 6 5 4 3 2 1 calculated by array,sum=55 calculated by pointer,sum=55 p3

28、000 a0地址地址 内容内容 数组元素数组元素3002 a13018 a9 ai aa+1a+9a+i p p p数组元素作为函数实参时,函数形参为变量数组元素作为函数实参时,函数形参为变量与变量作为函数实参相同,值传递与变量作为函数实参相同,值传递8.3.3 数组名作为函数的参数数组名作为函数的参数double fact(int n);int main(void)int i,n=5;double sum;sum=0;for(i=1;i=n;i+)sum=sum+fact(i);printf(sum=%en,sum);return 0;double fact(int n)int i;doub

29、le result=1;for(i=1;i=n;i+)result=result*i;return result;int a5=1,4,5,7,9;fact(ai-1);1!+4!+5!+7!+9!n数组名是指针常量,相当于指针作为函数的参数数组名是指针常量,相当于指针作为函数的参数n数组名数组名做为实参,形参是做为实参,形参是指针变量指针变量(数组)(数组)数组名作为函数的参数数组名作为函数的参数int sum(int*a,int n)int i,s=0;for(i=0;in;i+)s+=ai;return(s);例例int main(void)int i;int b5=1,4,5,7,9;

30、printf(%dn,sum(b,5);return 0;(1)(1)实参是数组名实参是数组名(2)(2)形参是指针变量形参是指针变量 可以写成数组形式可以写成数组形式int a*(a+i)int sum(int*a,int n)int i,s=0;for(i=0;in;i+)s+=ai;return(s);int main(void)int i;int b5=1,4,5,7,9;printf(%dn,sum(b,5);return 0;b b0b5asum(b,5)b0+b1+.+b4sum(b,3)b0+b1+b2sum(b+1,3)b1+b2+b3sum(&b2,3)b2+b3+b4例例

31、8-8二分查找二分查找int Bsearch(int*p,int n,int x)/*二分查找函数二分查找函数*/int low,high,mid;low=0;high=n-1;/*开始时查找区间为整个数组开始时查找区间为整个数组*/while(low=high)/*循环条件循环条件*/mid=(low+high)/2;/*中间位置中间位置*/if(x=pmid)break;/*查找成功,中止循环查找成功,中止循环*/else if(x pmid)high=mid-1;/*前半段,前半段,high前移前移*/else low=mid+1;/*后半段,后半段,low后移后移*/if(low aj

32、+1j=0 to 4j=0 to 3j=0 to 2j=0 to 6-1-i9 8 8 8 8 8 5 4 4 0 8 9 5 5 5 5 4 5 0 45 5 9 4 4 4 6 0 54 4 4 9 6 6 0 66 6 6 6 9 0 80 0 0 0 0 9 9 8 5 4 6 0i=1j=0:8 9 5 4 6 0j=1:8 5 9 4 6 0j=2:8 5 4 9 6 0j=3:8 5 4 6 9 0j=4:8 5 4 6 0 9int main(void)int i,j,n,t,a10;n=6;for(i=0;i n;i+)scanf(%d,&ai);for(i=1;i n;i+

33、)for(j=0;j aj+1)t=aj;aj=aj+1;aj+1=t;return 0;int main(void)int i,a10;for(i=0;i10;i+)scanf(%d,&ai);sort(a,10);for(i=0;i10;i+)printf(%d,ai);printf(n);return 0;void sort(int*array,int n)int i,j,t;for(i=1;in;i+)for(j=0;jarrayj+1)t=arrayj;arrayj=arrayj+1;arrayj+1=t;字符串:字符数组字符串:字符数组 字符指针字符指针8.4.1 程序解析程序解析

34、8.4.2 字符串和字符指针字符串和字符指针8.4.3 常用的字符串处理函数常用的字符串处理函数8.4 电码加密电码加密 8.4.1 程序解析加密程序解析加密#define MAXLINE 100void encrypt(char*);int main(void)char line MAXLINE;printf(Input the string:);gets(line);encrypt(line);printf(“%s%sn”,“After being encrypted:”,line);return 0;void encrypt(char*s)for(;*s!=0;s+)if(*s=z)*s

35、=a;else *s=*s+1;Input the string:hello hangzhouAfter being encrypted:ifmmp!ibohaipv8.4.2 字符串和字符指针字符串和字符指针 n字符串常量字符串常量arraypoint用一对双引号括起来的字符序列用一对双引号括起来的字符序列 被看做一个特殊的一维字符数组被看做一个特殊的一维字符数组,在内存在内存中连续存放中连续存放 实质上是一个指向该字符串首字符的指针实质上是一个指向该字符串首字符的指针常量常量char sa =array;char*sp=point;char sa =array;char*sp=point;

36、printf(%s,sa);printf(%s,sp);printf(%sn,string);array point stringprintf(%s,sa+2);printf(%s,sp+3);printf(%sn,string+1);ray nt tring数组名数组名sa、指针、指针sp和字符串和字符串 string 的值都是的值都是地址地址 字符数组与字符指针的重要区别字符数组与字符指针的重要区别 char sa =This is a string;char*sp=This is a string;saT h i si sas t r i n g 0spT h i si sas t r

37、i n g 0如果要改变数组如果要改变数组sa所代表的字符串,只能改变所代表的字符串,只能改变数组元素的内容数组元素的内容如果要改变指针如果要改变指针sp所代表的字符串,通常直接所代表的字符串,通常直接改变指针的值,让它指向新的字符串改变指针的值,让它指向新的字符串示例示例char sa =This is a string;char*sp=This is a string;strcpy(sa,Hello);sp=Hello;sa=“Hello”;非法非法数组名是常量,不能对它赋值数组名是常量,不能对它赋值字符指针先赋值,后引用字符指针先赋值,后引用定义字符指针后,如果没有对它赋值,指针的值定义

38、字符指针后,如果没有对它赋值,指针的值不不确定确定。char*s;scanf(“%s”,s);char*s,str20;s=str;scanf(“%s”,s);定义指针时,先将它的初值置为空定义指针时,先将它的初值置为空char*s=NULL 不要引用未赋值的指针不要引用未赋值的指针加密函数的两种实现加密函数的两种实现void encrypt(char s)int i;for(i=0;si!=0;i+)if(si=z)si=a;else si=si+1;void encrypt(char*s)for(;*s!=0;s+)if(*s=z)*s=a;else *s=*s+1;8.4.3 常用的字符

39、串处理函数常用的字符串处理函数n函数原型在函数原型在 stdio.h 或或 string.h 中给出中给出1、字符串的输入和输出、字符串的输入和输出输入字符串:输入字符串:scanf()或或gets()输出字符串:输出字符串:printf()或或puts()stdio.hchar str80;i=0;while(stri=getchar()!=n)i+;stri=0;(1)scanf(%s,str)输入参数:字符数组名输入参数:字符数组名,不加地址符不加地址符遇遇回车或空格回车或空格输入结束,并自动将输入的一串字符和输入结束,并自动将输入的一串字符和 0 送入数组中送入数组中(2)gets(s

40、tr)遇遇回车回车输入结束,自动将输入的一串字符和输入结束,自动将输入的一串字符和 0 送入数送入数组中组中 字符串的输入字符串的输入n tchar str80;for(i=0;stri!=0;i+)putchar(stri);(3)printf(%s,str)printf(%s,hello);(4)puts(str)puts(hello);输出字符串后自动换行输出字符串后自动换行输出参数可以是字符数组名或字符串常量,输出遇输出参数可以是字符数组名或字符串常量,输出遇 0 结束结束字符串的输出字符串的输出#include int main()char str80;scanf(%s,str);p

41、rintf(%s,str);printf(%s,Hello);return 0;例例8-10 字符串输入输出函数示例字符串输入输出函数示例#include int main()char str80;gets(str);puts(str);puts(Hello);return 0;ProgrammingProgrammingHelloProgramming is fun!ProgrammingHelloProgrammingProgrammingHelloProgramming is fun!Programming is fun!Hello2、字符串的复制、连接、比较、字符串的复制、连接、比较、

42、求字符串长度求字符串长度字符串复制:字符串复制:strcpy(str1,str2)字符串连接:字符串连接:strcat(str1,str2)字符串比较:字符串比较:strcmp(str1,str2)求字符串长度:求字符串长度:strlen(str)string.hstrcpy(str1,str2);将字符串将字符串 str2 复制到复制到 str1 中中 static char str120;static char str220=“happy”;字符串复制函数字符串复制函数strcpy()h a p p y 00strcpy(str1,str2);h a p p y 0str1中中strcpy

43、(str1,“world”);str1中中:w o r l d 0#include stdio.h#include string.hint main(void)char str120,str220;gets(str2);strcpy(str1,str2);puts(str1);return 0;strcpy()示例示例12341234 strcat(str1,str2);连接两个字符串连接两个字符串str1和和str2,并将结果放入并将结果放入str1中中字符串连接函数字符串连接函数strcat#include stdio.h#include string.hint main(void)cha

44、r str180,str220;gets(str1);gets(str2);strcat(str1,str2);puts(str1);return 0;str1中:中:Let us 0 str2中:中:go.0str1中:中:Let us go.0str2中:中:go.0Let usgo.Let us go.str1=str1+str2 非法!非法!strcmp(str1,str2)比较比较 两个字符串两个字符串str1和和str2的大小。的大小。规则:按字典序规则:按字典序(ASCII码序码序)如果如果 str1 和和 str2 相等,返回相等,返回 0;如果如果 str1 大于大于 str

45、2,返回一个正整数;返回一个正整数;如果如果 str1 小于小于 str2,返回一个负整数;返回一个负整数;static char s120=sea;字符串比较函数字符串比较函数strcmpstrcmp(s1,Sea);strcmp(Sea,Sea);strcmp(Sea,Sea);正整数正整数负整数负整数0#include stdio.h#include string.hint main(void)int res;char s120,s220;gets(s1);gets(s2);res=strcmp(s1,s2);printf(%d,res);return 0;strcmp()示例示例123

46、42-1利用字符串比较函数比较字符串的大小利用字符串比较函数比较字符串的大小 strcmp(str1,str2);为什么定义这样的函数?为什么定义这样的函数?用用strcmp()比较字符串比较字符串strcmp(str1,str2)0strcmp(str1,hello)str2 str1 s1 strcat(s1,s2)s1“+”s2=s1 若若 s1“=”s2,函数值为函数值为0 strcmp(s1,s2)若若 s1“”s2,函数值函数值 0 string.h 若若 s1“”s2,函数值函数值0 计算字符串的有效长度,计算字符串的有效长度,strlen(str)不包括不包括 0字符串处理函数

47、小结字符串处理函数小结int main()int i;int x,min;scanf(%d,&x);min=x;for(i=1;i 5;i+)scanf(%d,&x);if(x min)min=x;printf(min is%dn,min);return 0;例例8-11 求最小字符串求最小字符串#include int main()int i;char sx80,smin80;scanf(%s,sx);strcpy(smin,sx);for(i=1;i 5;i+)scanf(%s,sx);if(strcmp(sx,smin)0)strcpy(smin,sx);printf(min is%sn

48、,smin);return 0;2 8-1 99 0 min is 1 tool key about zoo sea min is about 8.5 任意个整数求和任意个整数求和*例例8-12 先输入一个正整数先输入一个正整数n,再输入任意再输入任意n个个整数,计算并输出这整数,计算并输出这n个整数的和。个整数的和。要求使用要求使用动态内存分配方法动态内存分配方法为这为这n个整数分个整数分配空间。配空间。8.5.1 程序解析程序解析int main()int n,sum,i,*p;printf(Enter n:);scanf(%d,&n);if(p=(int*)calloc(n,sizeof

49、(int)=NULL)printf(Not able to allocate memory.n);exit(1);printf(Enter%d integers:,n);for(i=0;i n;i+)scanf(%d,p+i);sum=0;for(i=0;i n;i+)sum=sum+*(p+i);printf(The sum is%d n,sum);free(p);return 0;Enter n:10Enter 10 integers:3 7 12 54 2 19 8 1 0 15The sum is 81 8.5.2 用指针实现内存动态分配用指针实现内存动态分配 n变量在使用前必须被定义

50、且安排好存储空间变量在使用前必须被定义且安排好存储空间n全局变量全局变量、静态局部变量静态局部变量的存储是在的存储是在编译时编译时确定,在程序开始执行前完成。确定,在程序开始执行前完成。n自动变量自动变量,在执行进入变量定义所在的复合,在执行进入变量定义所在的复合语句时为它们分配存储,变量的大小也是静语句时为它们分配存储,变量的大小也是静态确定的。态确定的。n一般情况下,运行中的很多存储要求在写程一般情况下,运行中的很多存储要求在写程序时无法确定。序时无法确定。动态存储管理动态存储管理 n不是由编译系统分配的,而是由用户在程不是由编译系统分配的,而是由用户在程序中通过动态分配获取。序中通过动态

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(指针详细讲解课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|