第8章 指针-2_第1页
第8章 指针-2_第2页
第8章 指针-2_第3页
第8章 指针-2_第4页
第8章 指针-2_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1例例8 8-6-6另解:输入另解:输入3 3个整数,按降序(从大到小的顺序)个整数,按降序(从大到小的顺序)输出。要求使用变量的指针作函数调用的实参来实现。输出。要求使用变量的指针作函数调用的实参来实现。#include void main() void exchange(int *q1,int *q2,int *q3); int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d,&a,&b, &c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf(%d,%d,%dn,a,b,c)

2、;2void exchange(int *q1,int *q2,int *q3) void swap(int *pt1,int *pt2); if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3); void swap(int *pt1,int *pt2)int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; 运行情况如下运行情况如下: please input three umbers:please input three umbers:9,0,10 9,0,10 10,9,0

3、10,9,0p2表示表示p1处于高地址位置;处于高地址位置;p1p2表示表示p1处处于低地址位置。于低地址位置。8v指针变量的关系运算:指针变量的关系运算:例例8-38-3结合上面介绍的指针运算,编写一个计算字结合上面介绍的指针运算,编写一个计算字符串长度的函数符串长度的函数slen()slen()。int slen( char *str) char *p=str; while ( *p!=0)p+; return p-str;9数组元素表示方法数组元素表示方法a0a1a2a3a9.aa+9a+1a+2地址地址元素元素下标法下标法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址地

4、址元素元素指针法指针法*p*(p+1)*(p+2)*(p+9) 变址运算符变址运算符 ai *(a+i)ai pi *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p910例例 int a=1,2,3,4,5,6,7,8,9,10,int a=1,2,3,4,5,6,7,8,9,10,* *p=a,i;p=a,i; 数组元素地址的正确表示:数组元素地址的正确表示:(A A)&(a+1) &(a+1) (B B)a+ a+ (C C)&p &p (D D)&pi&pi 数组名是数组名是地址常量地址常量p+,p- (p+

5、,p- ( ) )a+,a- (a+,a- ( ) )a+1, a+1, * *(a+2) (a+2) ( ) )11a0a1a2a3a4例例8-78-7输出数组输出数组a a中的全部元素。中的全部元素。01234下标法下标法#include void main() int a5,i; for(i=0;i5;i+) ai=i; for(i=0;i5;i+) printf(%dn, ai);12a0a1a2a3a4例例8-78-7输出数组输出数组a a中的全部元素。中的全部元素。01234通过数组名计算元素的地址,找出元通过数组名计算元素的地址,找出元素的值素的值#include void ma

6、in() int a5,i; for(i=0;i5;i+) *(a+i)=i; for(i=0;i5;i+) printf(%dn, *(a+i);13a0a1a2a3a4例例8-78-7输出数组输出数组a a中的全部元素。中的全部元素。01234指针法指针法#include void main() int a5,i,*p; p=a; for(i=0;i5;i+) *(p+i)=i; for(i=0;i5;i+) printf(%dn, *(p+i);p14a0a1a2a3a4例例8-88-8输出数组输出数组a a中的全部元素。中的全部元素。01234指针法指针法#include void m

7、ain() int a5,i,*p=a; for(i=0;i5;i+) *p=i; printf(%dn, *p+); p15例例8-98-9输出数组输出数组a a中的全部元素。中的全部元素。注意指针变量的当前值注意指针变量的当前值#include void main() int *p,i,a5; p=a; for(i=0;i5;i+) *p+=i; for(i=0;i5;i+) printf(%dn, *p+);pp01234.0123456appppppp=a;指针变量可以指指针变量可以指到到数组后数组后的内存的内存单元单元16u* *(p+)(p+)与与* *(+p)(+p)作用不同。若

8、作用不同。若p p的初值为的初值为a(a(数组名),则数组名),则* *(p+)(p+)等价等价a0a0,* *(+p)(+p)等等价价a1 a1 u* *p+p+等价于等价于* *(p+)(p+)u( (* *p)+p)+表示表示p p所指向的元素值加所指向的元素值加1 1u 如果如果p p当前指向当前指向a a数组中的第数组中的第i i个元素,则个元素,则* *(p+)(p+)相当于相当于ai+ai+;* *(+p)(+p)相当于相当于a+ia+i;在使用前必须首先弄清楚是先取在使用前必须首先弄清楚是先取p p值还是先使值还是先使p p加加1 1178.5 指针与数组指针与数组用数组指针作

9、函数参数用数组指针作函数参数v数组名作函数参数,是数组名作函数参数,是地址传递地址传递v数组名作函数参数,实参与形参的对应关系数组名作函数参数,实参与形参的对应关系实参实参形参形参数组名数组名指针变量指针变量数组名数组名指针变量指针变量数组名数组名数组名数组名指针变量指针变量指针变量指针变量C C编译都是将形参数编译都是将形参数组名作为指针变量组名作为指针变量来处理。来处理。如如f(int arr)f(int arr)相相当于当于f(int f(int * *arr)arr)实质上都是地址传递实质上都是地址传递18例例8-10(1)数组元素作实参数组元素作实参整型变量作形参整型变量作形参#in

10、clude void s1(int x,int y)int temp;temp=x;x=y;y=temp;12a调用前调用前a0a112a调用调用a0a112xy21xy交换交换12a返回返回void main()int a2=1,2; s1(a0,a1); printf(%d,%dn,a0,a1);值传值传递递运行结果:运行结果:1,21,2 19例例8-10(2)数组名作实参数组名作实参指针变量作形参指针变量作形参#include void s2(int *p)int temp; temp=*p; *p=*(p+1); *(p+1)=temp;void main()int b2=1,2;

11、s2(b); printf(%d,%dn,b0,b1);地址传递地址传递12b调用前调用前12bp调用调用21bp交换交换21b返回返回运行结果:运行结果:2,12,1 20例例8-10(3)#include void s2(int *p)int temp; temp=*p; *p=*(p+1); *(p+1)=temp;void main()int c2=1,2; int *p1=c; s2(p1); printf(%d,%dn,c0,c1);地址传递地址传递12cp调用调用21cp交换交换21c返回返回运行结果:运行结果:2,12,1 指针变量作实参指针变量作实参指针变量作形参指针变量作形

12、参12cp1调用前调用前21例例8-10(4)#include void s3(int f) int temp; temp=f0; f0=f1; f1=temp;void main()int d2=1,2; s3(d); printf(%d,%dn,d0,d1);地址传递地址传递12df调用调用21df交换交换21d返回返回运行结果:运行结果:2,12,1 数组名作实参数组名作实参数组名作形参数组名作形参12d调用前调用前22例例8-10(5)#include void s3(int f) int temp; temp=f0; f0=f1; f1=temp;void main()int e2=

13、1,2; int *p2=e; s3(p2); printf(%d,%dn,e0,e1);地址传递地址传递12ef调用调用21ef交换交换21e返回返回运行结果:运行结果:2,12,1 指针变量作实参指针变量作实参数组名作形参数组名作形参12ep2调用前调用前238.5 指针与数组指针与数组注意注意v若用指针变量作实参,必须先使指针变量有确若用指针变量作实参,必须先使指针变量有确定值,指向一个已定义的数组单元。定值,指向一个已定义的数组单元。如: 下面的使用是不正确的:下面的使用是不正确的:void main() f(x,int n)int *p; . f(p,10); . . . . 24例

14、例8-118-11用选择法对数组用选择法对数组a a的的1010个元素按值从大到小排个元素按值从大到小排序。要求主函数进行输入输出,子函数进行排序。序。要求主函数进行输入输出,子函数进行排序。 #include void sort(int x,int n)int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jxk)k=j; if(k!=i) t=xi; xi=xk; xk=t; void main()int *p,i,a10=1,7,10,11,0,8,9,5,4,2; for(i=0;i10;i+) printf(%d,ai); printf(n); p

15、=a; / 指针变量指针变量p指向数组指向数组a的首地址的首地址 sort(p,10); for(p=a,i=0;i10;i+) printf(%d ,*p);p+; printf(n);25v一级指针变量与一维数组的关系一级指针变量与一维数组的关系int *p 与与 int q10 l数组名是指针(地址)数组名是指针(地址)常量常量l若若p=q; 则则p+i 是是qi的地址的地址l数组元素的表示方法数组元素的表示方法:下标法下标法和和指针法指针法, 即若即若p=q, 则则 pi qi *(p+i) *(q+i) l形参数组形参数组名名实质上是实质上是指针变量指针变量,即,即int q int

16、 *ql在定义指针变量(不是形参)时,在定义指针变量(不是形参)时,不能不能把把int *p 写成写成int p ;l系统只给系统只给p分配能保存一个指针值的内存区分配能保存一个指针值的内存区(一一般般2或或4字节);而给字节);而给q分配分配2*10(或(或4*10)字节字节的内存区的内存区268.6 指针与字符串指针与字符串字符串的表示形式字符串的表示形式v用字符数组实现用字符数组实现例例 void main( ) char string=“I love China!”; printf(“%sn”,string); printf(“%sn”,string+7); IloveChistrin

17、g0string1string2string3string4string5string6string7string8string9stringstring10string11string12string13n!a027v用字符指针实现用字符指针实现例例 void main( ) char *string=“I love China!”; printf(“%sn”,string); string+=7; while(*string !=0) putchar(string0); string+; IloveChistringn!a0字符指针变量字符指针变量初始化初始化: :把字符串把字符串首地址首

18、地址赋给赋给stringstring char *string; string=“I love China!”; string相当于相当于*(string+0);但: 下面的使用是不正确的:下面的使用是不正确的:char string10;string=“I love China!”;因为因为string是数组名,是地址常是数组名,是地址常量。量。char *string;*string=“I love China!”;也是不也是不正确的正确的28例例8-148-14用字符数组法和字符指针法分别表示并输用字符数组法和字符指针法分别表示并输出一个字符串。出一个字符串。#include void

19、main() char str1=c program;/ char *str2=c program;/ printf(%sn,str1);/ printf(%sn,str2);/ str1运行结果:运行结果:c c programprogramc c programprogram29v通过字符数组名或字符指针变量可以输出一个通过字符数组名或字符指针变量可以输出一个字符串。用字符串。用%s可以对一个字符串进行整体的输可以对一个字符串进行整体的输入输出。而对一个入输出。而对一个数值型数值型数组,是不能企图用数数组,是不能企图用数组名输出它的全部元素的。组名输出它的全部元素的。v对字符串中字符的存取

20、,可以用下标法,也可对字符串中字符的存取,可以用下标法,也可以用指针法。以用指针法。例例 int i10; . . . printf(“%dn”,i);30例例8-158-15用指针变量将字符串用指针变量将字符串str1str1复制到字符数组复制到字符数组str2str2。 #include void main()char *str1=hello,str26,*p; / p=str2; / for(;*str1!=0;p+,str1+)/*p=*str1; / *p=0;/ printf(%s,str2);31#include void main()char *str1=hello,str26

21、,*p; / p=str2; / for(;*str1!=0;p+,str1+)/*p=*str1; / *p=0;/ printf(%s,str2);str1pstr232例例8-16 8-16 比较两个字符串是否相等。比较两个字符串是否相等。 #include void main()char *str1=this,*str2=that; int t=0; for(;*str1!=0& *str2!=0;str1+,str2+)if (*str1!=*str2) t=1;break; if (t=0) printf(y);else printf(n);33字符串指针作函数参数字符串指

22、针作函数参数 P159P15934例例8-16 比较两个字符串是否相等。比较两个字符串是否相等。 #define L1 100#define L2 100#define L L1+L2#include void scat(char *p1,char *p2,char *p) while (*p1!=0)*p+=*p1+; while (*p+=*p2+);例例8-178-17将两个字符串合并为一个新的字符串。将两个字符串合并为一个新的字符串。void main() char str1L1,str2L2,strL; gets(str1); gets(str2); scat(str1,str2,s

23、tr); puts(str);35例例8-18 8-18 用函数调用实现字符串复制用函数调用实现字符串复制(1 1)用字符数组名作参数)用字符数组名作参数(2 2)用字符指针变量作参数)用字符指针变量作参数aIamateaceh0r.fromabyuarasutndetoboet.0Iaaeceh0r.t.0mtavoid cpystr(char from,char to) int i=0; while(fromi!=0) toi=fromi; i+; toi=0;void main() char a=I am a teacher.; char b=You are a student.; pr

24、intf(string_a=%sn string_b=%sn,a,b); cpystr(a,b); printf(nstring_a=%snstring_b=%sn,a,b);36字符串指针作函数参数字符串指针作函数参数例例8-18 8-18 用函数调用实现字符串复制用函数调用实现字符串复制(1 1)用字符数组名作参数)用字符数组名作参数(2 2)用字符指针变量作参数)用字符指针变量作参数#include void cpystr(char *p1,char *p2) while(*p2+=*p1+);void main() char *pa=CHINA,b10,*pb; pb=b; cpyst

25、r(pa,pb); printf(%s,pb);37#includevoid cpystr(char *p1,char *p2)for(;*p1!=0;p1+,p2+) *p2=*p1; *p2=0;void main() char *pa=I am a teacher.; char *pb=You are a student.; cpystr(pa,pb); printf(string_pa=%snstring_pb=%sn,pa,pb);字符串常量不能改变字符串常量不能改变38int cpystr( char from, char to ) while(*to+ = *from+);39用

26、字符数组和字符指针实现字符串表示的不同用字符数组和字符指针实现字符串表示的不同 lstr由若干元素组成,每个元素放一个字符;而由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址中存放字符串首地址l定义方式不同定义方式不同 char str1=c program; char *cp=c program;l赋值方式不同。赋值方式不同。char str20; str=“I love China!”; ( ) char *cp; cp=“I love China!”; ( )char *cp; 与与 char str20;40用字符数组和字符指针实现字符串表示的不同用字符数组和字符指针实现字符串表示的不同 l对字符指针变量赋初值:对字符指针变量赋初值: char *cp= love China!;等价于等价于 char *cp; cp=I love China!; 而对数组的初始化:而对数组的初始化: char str20= love China!; 不能等价于不能等价于 char str20; str I love China!;char *cp; 与与 char str20;41用字符数组和字符指针实现字符串表示的不同用字符数组和字符指针实现字符串表示的不同 lstr是地址常量;是地址常量;cp是地址变量是地址变量char *cp; 与与 char str2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论