C语言程序设计第八章指针.ppt

上传人:wuy****n92 文档编号:70099865 上传时间:2023-01-16 格式:PPT 页数:106 大小:1.58MB
返回 下载 相关 举报
C语言程序设计第八章指针.ppt_第1页
第1页 / 共106页
C语言程序设计第八章指针.ppt_第2页
第2页 / 共106页
点击查看更多>>
资源描述

《C语言程序设计第八章指针.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第八章指针.ppt(106页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第八章第八章 指针指针C8.1概述C程序设计中使用指针可以:使程序简洁、紧凑、高效有效表示复杂的数据结构动态分配内存方便使用字符串有效使用数组调用函数时可以得到多于1个的值直接处理内存地址C8.2指针的概念一、数据的存取一、数据的存取1、内存地址内存的每个字节都有一个编号,这个编号称为“内存地址”。低地址高地址2000200220043000程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据。inti,j,k;ijk2、内存单元的地址和内存单元的内容的区别:若i=3,j=5;00000011000000000000010100000000从图中可以看出它们的区

2、别。C程序编译后已经没有i、j、k这些变量名了,而是将变量名转换为变量的地址,计算机通过内存地址对变量进行存取。二、直接访问和间接访问二、直接访问和间接访问1、直接访问方式:低地址高地址2000200220043000ijk00000011000000000000010100000000、i=3;、j=i+2;、printf(%d,i);、scanf(%d,&i);、k=i+j;如何执行?0000100000000000按变量的地址存取变量的方式2、间接访问方式:语言中可以定义整型变量、实型变量、字符型变量,各自存放相应类型的数据;另外还可以定义和使用一种特殊类型的变量,用来存放变量的地址用来

3、存放变量的地址用来存放变量的地址用来存放变量的地址。C低地址高地址2000200220043000ijk000000110000000000000101000000000000100000000000假设已经定义变量ip用来存放整型变量的地址,它被分配到内存单元3000和3001。ip通过执行语句:ip=&i;将整型变量i的地址存放到变量ip中,即ip的值为变量i所对应的内存单元的起始地址2000。2000现在要存取i的值可以这样做:先找到存放i的地址的内存单元地址(3000和3001),从中取出变量i的地址(2000),然后再对2000和2001单元进行存取这就称为间接访问。C通过变量ip知

4、道变量i的地址,从而找到变量i的内存单元,因此说变量ip指向变量i,用箭头表示这种“指向”关系。20003000ip2000i变量ip的值为2000,即变量i的地址,这样就在ip和i之间建立了一种联系:3、关于“指向”的含义:C4、为了表示将数值10送到变量i中,可以有两种表示方法:、将10送到变量i所标志的单元中;2000i10、将10送到变量ip所指向的单元中;20003000ip2000i10C三、指针与指针变量通过地址能找到所需的变量单元,可以说:地址“指向”该变量单元。因此,把一个变量的地址称为该变量的“指针”。低地址高地址2000200220043000ijk00000011000

5、0000000000101000000000000100000000000ip20002000如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。注意区分“指针”和“指针变量”这两个概念。C.2000200420062005整型变量i10变量i_pointer200120022003指针与指针变量指针:一个变量的地址指针变量:专门存放变量地址的变量2000指针指针变量 变量的内容 变量的地址指针变量变量变量地址(指针)变量值 指向地址存入指针变量C、数据所占有的内存单元个数是由其数据类型决定的;、首地址:即第一个单元的地址;、表示

6、地址的数与整数的区别;、变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心。、程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的;四、说明四、说明C8.3指针变量的定义和引用指针运算符:*为了表示指针变量和它所指向的变量之间的联系,用“*”表示指向的关系。如:ip代表指针变量,*ip表示ip所指向的变量。即*ip也代表一个变量。例:、若:ip=&i;i=5;*ip=5;结论:*ip与i等价。、x=i+1;x=*ip+1;C取地址运算符:&它与一个变量连用,以得到该变量的内存地址。说明:、取地址运算符只能作用于变量:&x,&a5;不能作用于常量

7、、表达式或寄存器变量:&25,&(i+1);、不能把整数赋值给一个指针变量:ip=3000;、不能把一个指针变量的值赋值给一个整型变量:x=ip;C&与*运算符含义含义:取变量的地址单目运算符优先级:2结合性:自右向左含义:取指针所指向变量的内容单目运算符优先级:2结合性:自右向左两者关系:互为逆运算理解.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址200010i_pointer*i_poi

8、nter&i_pointerii_pointer&i&(*i_pointer)i*i_pointer*(&i)i_pointer=&i=&(*i_pointer)i=*i_pointer=*(&i)C8.3.1指针变量的定义与赋值一、指针变量的定义合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是*运算符例int*p1,*p2;float*q;staticchar*name;存储类型 数据类型 *指针变量名;C说明:“*”只表示定义的变量为指针变量,但指针变量名中并不包含“*”;*是指针变量的标志,不可丢掉;指针变量定义时,指定了它所指向的变量的数据类型;指针变量定义

9、时必须指定其所指向的变量的数据类型,而且使用过程中只能指向同一种类型的变量。指针变量定义后,系统为变量分配一个存储单元,用来存放地址;根据存储单元的长度分为大存储模式(长指针,4Byte)和小存储模式(短指针,2Byte);指针变量定义后,若不赋值,其值是不确定的。C二、指针变量的赋值1、赋值语句:inti,j,*p1,*p2;p1=&i;p2=&j;charch,*cp1,*cp2;cp1=&ch;cp2=&ch;2、初始化:int i,*p1=&i;int i,*p1;int i,*p1;p1=&i;p1=&i;C一般形式:存储类型 数据类型*指针变量名=初始地址值;赋给指针变量,不是赋给

10、目标变量例 int i;int *p=&i;变量必须已说明过类型应一致例 int i;int *p=&i;int *q=p;用已初始化指针变量作初值例 main()int i;static int *p=&i;.()不能用auto变量的地址去初始化static型指针C3、说明:、指针变量定义后,若不赋值,其值是不确定的;、可以给指针变量赋空值(NULL),使指针变量不指向不指向不指向不指向任何变量任何变量任何变量任何变量;ip=NULL;ip=NULL;#define NULL 0#define NULL 0、指针变量的值为空值(NULL)与未对指针变量赋值,意义不同;、只能是同类型变量的地址

11、进行赋值;int i,*ip;int i,*ip;char ch,*cp;char ch,*cp;ip=&i;ip=&i;cp=&ch;cp=&ch;ip=&ch;ip=&ch;cp=&i;cp=&i;、可以将数组名或函数名赋给某些类型的指针变量;int a10,*ip;int a10,*ip;ip=&a;ip=&a;ip=a;ip=a;、不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;int *ip;int *ip;ip=3000;ip=3000;C8.3.2指针变量的引用int a,*p1,*p2;p1=&a;printf(%x,p1);p2=p1;*p1=3;printf

12、(%d,*p1);int a,*p1,*p2;不定a不定p1不定p2p1=&a;&aprintf(%x,p1);p2=p1;&a*p1=3;3printf(%d,*p1);C1、两个运算符:&和*&:取地址运算符;*:指针运算符(间接访问符);2、说明:、&既可作用于一般变量,也可作用于指针变量;、*只能作用于指针变量;、表达式中的*p与变量定义中的*p含义不同;inti,*p=&i;*p=5;、inta,*p=&a;inta,*p;p=&a;inta,*p;*p=&a;3、指针变量可以进行的操作:inta,*p1,*p2;、赋值:p1=&a;p2=p1;、输出:printf(%x,p1);、

13、取内容:*p1=5;a=5;printf(%d,*p1);C例8.1#include void main()int a1=11,a2=22;int *p1,*p2;p1=&a1;p2=&a2;printf(%d,%dn,*p1,*p2);p2=p1;printf(%d,%dn,*p1,*p2);11a122a2不定p1不定p2&a1&a2*p1*p2&a1*p2*p2多个指针可以指向同一个存储单元。但在某一时刻,一个指针变量只能指向一个存储单元,因为指针变量在某一时刻只能存放一个变量的地址值。C例8.2#include void main()int a1=11,a2=22;int *p1,*p

14、2,*p;p1=&a1;p2=&a2;printf(%d,%dn,*p1,*p2);p=p1;p1=p2;p2=p;printf(%d,%dn,*p1,*p2);11a122a2不定p1不定p2不定p&a1&a2*p1*p2&a1&a2*p1*p1&a1*p2*p2使两个指针交换指向使两个指针交换指向C例8.3#include void main()int a1=11,a2=22,t;int *p1,*p2;p1=&a1;p2=&a2;printf(%d,%dn,a1,a2);t=*p1;*p1=*p2;*p2=t;printf(%d,%dn,a1,a2);11a122a2不定t不定p1不定p

15、2&a1*p1&a2*p2112211交换两个指针变量所指向变量的值交换两个指针变量所指向变量的值C 反映了指针变量的引用方法:反映了指针变量的引用方法:、将变量的地址赋给指针变量(p1=&a1)、将一个指针变量赋给另一个指针变量(p2=p1)、通过指针变量间接访问它所指向的变量(*p1)4、*和&运算符的进一步说明:、若有:p1=&a;则*p1等价于a;&*p1&(*p1)&a、*&a*(&a)*pa、(*p)+等价于:a+不同于:*p+*p+*(p+)C指针作为函数参数输入两个整数a、b,按大小顺序输出。#include void swap(int x,int y)int temp;tem

16、p=x;x=y;y=temp;void main()int a,b;printf(nInput a,b:);scanf(%d%d,&a,&b);if (ab)swap(a,b);printf(max=%d,min=%dn,a,b);注意:语言中的函数调用采用“传值”方式,即单向传递方式。即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。Eg804.cppC#include void swap(int*px,int*py)int temp;temp=*px;*px=*py;*py=temp;void main()int a,b,*p1,*p2;printf(n

17、Input a,b:);scanf(%d%d,&a,&b);p1=&a;p2=&b;if (ab)swap(p1,p2);printf(max=%d,min=%dn,a,b);5a8b&ap1&bp2不定px不定py&a&b858a5b&ap1&bp2C#include void swap(int*px,int*py)int*temp;*temp=*px;*px=*py;*py=*temp;void main()int a,b,*p1,*p2;printf(nInput a,b:);scanf(%d%d,&a,&b);p1=&a;p2=&b;if (ab)swap(p1,p2);printf(

18、max=%d,min=%dn,a,b);*temp是指针变量temp所指向的变量,但temp中并无确定的地址值,其值不确定;*temp所指向的单元也不确定。因此,对*temp赋值可能会破坏系统的正常工作状况。应该将*px的值赋给一个整型变量,用整型变量作为临时存储空间实现*px和*py的交换。C#include void swap(int*px,int*py)int*p;p=px;px=py;py=p;void main()int a,b,*p1,*p2;printf(nInput a,b:);scanf(%d%d,&a,&b);p1=&a;p2=&b;if (ab)swap(p1,p2);p

19、rintf(max=%d,min=%dn,a,b);5a8b&ap1&bp2不定px不定py&a&b&b&a5a8b&ap1&bp2C如果想通过函数调用得到几个要改变的值,可以:、在主调函数中设n个变量;、将n变量的地址作为实参传给所调用的函数的形参;、通过形参指针变量,改变该n个变量的值;、主调函数就可以使用这些改变了的值;C8.4指针与数组一个变量有地址,称变量的地址为该变量的指针指针;指针变量可以指向变量,当然也可以指向数组和数组元素;每个数组都有一个起始地址,数组的起始地址称为数组的指针数组的指针;一个数组包含若干元素,每个数组元素都在内存中占用一定的存储单元,即都有相应的地址,数组元

20、素的地址称为数组元素的指针数组元素的指针;数组元素的指针变量数组元素的指针变量就是专门用来存放数组元素地址的变量。C指针与数组指针可以指向数组和数组元素当一个指针指向数组后,对数组元素的访问,既可以使用数组下标,也可以使用指针用指针访问数组元素,程序的效率更高(占内存少,运行速度快)用下标访问数组元素程序更清晰C8.4.1指向数组元素的指针变量定义类型名*指针变量名例:inta10;/*定义包含10个整型元素的数组a*/int*p;/*定义指向整型变量的指针变量p*/指向数组元素的指针变量,其类型应与数组元素相同为了让指针p指向数组a,应把数组a的地址赋给指针变量pCa0a1a2a3a4a5a

21、6a7a8a9a a不定p赋值:p=&a0;&a0说明:、语言中的数组名代表数组首地址,即第0号元素的地址;p=&a0;p=a;、定义时可以进行初始化:int*p=&a0;int*p;p=&a0;int*p;*p=&a0;int*p=a;int*p=a;C8.4.2通过指针访问一维数组inta10;int*p;如果:p=a;(或p=&a0;)则*p=5;a0=5;p=&a3;*p=5;a3=5;又如果:当指针p指向数组a后,可用指针p访问数组的各个元素。C通过指针访问一维数组C规定:若指针变量p已指向数组中的一个元素,则p1指向该数组中的下一个元素如果指针p指向数组a(指向数组第一个元素a0)

22、,则:p+1指向下一个元素a1,注意不是将p值简单加1。如果数组元素是整型,p+1表示p的地址加2;如果数组元素是实型,p+1表示p的地址加4;如果数组元素是字符型,p+1表示p的地址加1C通过指针访问一维数组p+i指 向 元 素 ai。可 以 使 用*(p+i)访问元素aip+i也可以记作a+i。指向元素ai。指向数组的指针变量也可以带下标,如,pi与*(p+i)等价,表示元素ai。C指针的运算指针变量的赋值运算p=&a;(将变量a地址p)p=array;(将数组array首地址p)p=&arrayi;(将数组元素地址p)p1=p2;(指针变量p2值p1)不能把一个整数p,也不能把p的值整型

23、变量C指针的运算指针的算术运算pipid(i为整型数,d为p指向的变量所占字节数)p+,p-,p+i,p-i,p+=i,p-=i等若p1与p2指向同一数组,p1-p2=两指针间元素个数(p1-p2)/dp1+p2无意义C指针的运算例p指向float数,则p+1p+14例p指向int型数组,且p=&a0;则p+1指向a1例inta10;int*p=&a2;p+;*p=1;例inta10;int*p1=&a2;int*p2=&a5;则:p2-p1=3;a0a1a2a3a4a5a6a7a8a9a数组pp+1,a+1p+i,a+ip+9,a+91C指针的运算指针变量的关系运算若p1和p2指向同一数组,

24、则p1p2表示p1指的元素在后p1=p2表示p1与p2指向同一元素若p1与p2不指向同一数组,比较无意义p=NULL或p!=NULLC数组元素表示方法a0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)变址运算符ai *(a+i)aipi*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9C通过指针访问一维数组例10.1输出有10个元素的整型数组a中的全部元素1、下标法(常用,很直观)main()inta10;inti;for(i=0;i10;i+)s

25、canf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,ai);例10.1输出有10个元素的整型数组a中的全部元素1、下标法(常用,很直观)main()inta10;inti;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d,ai);下标C通过指针访问一维数组2、用数组名计算数组元素的地址。(效率与下标法相同,不常用)main()inta10;inti;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%d

26、,*(a+i);数组名C通过指针访问一维数组3.用指针访问各元素。(常用,效率高)main()inta10;int*p,i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(p=a;p(a+10);p+)/*p+使p指向下一个元素*/printf(%d,*p);指针移动C通过指针访问一维数组三种方法比较:方法1、2费时,编译系统先将ai转换为*(a+i),即先计算元素地址;方法3不用每次计算地址,执行效率高;下标法直观。C通过指针访问一维数组使用指针指向数组,应注意以下问题:1.若 指 针 p指 向 数 组 a,虽 然 p+i与 a+i、*(p+i)与*(a

27、+i)意义相同,但仍应注意p与a的区别(a代表数组的首地址,是不变的;p是一个指针变量,可以指向数组中的任何元素,实现使自身的值改变)for(p=a;a(p+10);a+)printf(%d,*a)a代表数组的首地址,是不变的,a+不合法C通过指针访问一维数组2.指针变量可以指向数组中的任何元素,在程序运行期间,要始终注意指针变量当前所指向的是哪一个元素main()int*p,i,a10;p=a;for(i=0;i10;i+)scanf(%d,p+);printf(n);for(i=0;i10;i+,p+)printf(%d,*p);p=a;C通过指针访问一维数组3.使用指针时,应特别注意避免

28、指针访问越界。在上例中,第二次for循环,p已经越过数组的范围,但编译器不能发现该问题。避免指针访问越界是程序员自己的责任。C通过指针访问一维数组4.指针使用的几个细节:设指针p指向数组a(p=a),则:p+(或p+=1),p指向下一个元素a1。如执行*p,则取出a1的值*p+,相当于*(p+)。因为,*和+同优先级,+是右结合运算符(p375)。则先得到*p,再执行p=p+1。*(p+)与*(+p)的作用不同。*(p+):先取*p,再使p加1。*(+p):先使p加1,再取*p。C通过指针访问一维数组(*p)+表示,p指向的元素值加1。如果p当前指向数组a的第i个元素,则:*(p-)相当于ai

29、-,先取*p,再使p减1。*(+p)相当于a+i,先使p加1,再取*p。*(-p)相当于a-i,先使p减1,再取*p。C例inta=1,2,3,4,5,6,7,8,9,10,*p=a,i;数组元素地址的正确表示:(A)&(a+1)(B)a+(C)&p(D)&pi Cvoidmain()inta=5,8,7,6,2,7,3;inty,*p=&a1;y=(*-p)+;printf(“%d”,y);printf(“%d”,a0);输出:56pp58762730123456a例注意指针变量的运算6C通过指针在函数间传递一维数组1、数组元素作为函数参数:voidswap(intx,inty);swap(

30、a1,a2);2、数组名作为函数参数:voidf(intxintx,intn);f(a a,10);数组名代表数组首地址。用数组名作实参,调用函数时是把数组首地址传递给形参,而不是把数组的值传给形参。这样,实参数组和形参数组共占同一段内存区域。从而在函数调用后,实参数组的元素值可能会发生变化。a0a1a2a3a4a5a6a7a8a9a ax xx0 x1x2x3x4x5x6x7x8x9实际上能够接受并存放地址值的只能是指针变量,编译系统都是将形参数组编译系统都是将形参数组名作为指针变量来处理的名作为指针变量来处理的。voidf(int*x,intn);voidf(int*x,intn);xix

31、i*(x+i)*(x+i)C通过指针在函数间传递一维数组变量名与数组名作函数参数时的比较:实参类型实参类型实参类型实参类型变量名变量名变量名变量名数组名数组名数组名数组名要求形参的类型要求形参的类型要求形参的类型要求形参的类型传递的信息传递的信息传递的信息传递的信息能否改变实参的值能否改变实参的值能否改变实参的值能否改变实参的值变量名变量的值不能数组名或指针变量数组的起始地址能需要说明的是:需要说明的是:需要说明的是:需要说明的是:语言的函数调用都是采用“值传递值传递”方式;当用变量名作函数参数时传递的是变量的值;用数组名作函数参数时,由于数组名代表的是数组首地址,因此传递的是数组首地址,所以

32、要求形参为指针变量。C归纳起来,实参与形参的对应关系有:、形参和实参都用数组名:f(intx,intn);f(a,10);把实参数组首地址传给形参作为形参数组首地址;、实参用数组名,形参用指针变量:f(int*x,intn);f(a,10);把实参数组首地址传给形参(指针变量),函数中用指针访问实参数组、形参和实参都用指针变量:f(int*x,intn);f(p,10);函数调用前应先给实参指针变量赋值(如:p=a)、实参为指针变量,形参为数组名:f(intx,intn);f(p,10);实参通过指针变量为形参提供数组首地址;Cvoidinv(intx,intn)intt,i,j,m=(n-1

33、)/2;for(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;main()inti,a10=3,7,9,11,0,6,7,5,4,2;inv(a,10);printf(Thearrayhasbeenreverted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);例将数组a中的n个整数按相反顺序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723实参与形参均用数组m=4Cvoidinv(int*x,intn)intt,*p,*i,*j,m=(n-1)/2;i=

34、x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;main()inti,a10=3,7,9,11,0,6,7,5,4,2;inv(a,10);printf(Thearrayhasbeenreverted:n);for(i=0;i10;i+)printf(%d,ai);printf(n);实参用数组,形参用指针变量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma数组60711594723ijijijjiji例将数组a中的n个整数按相反顺序存放 Cvoidinv(int*x,intn)intt,*i,*j,*p,m=(n-1)

35、/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;main()inti,a10,*p=a;for(i=0;i10;i+,p+)scanf(%d,p);p=a;inv(p,10);printf(Thearrayhasbeenreverted:n);for(p=a;pa+10;p+)printf(%d,*p);实参与形参均用指针变量例将数组a中的n个整数按相反顺序存放 Cvoidinv(intx,intn)intt,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;main()inti,a

36、10,*p=a;for(i=0;i10;i+,p+)scanf(%d,p);p=a;inv(p,10);printf(Thearrayhasbeenreverted:n);for(p=arr;parr+10;p+)printf(%d,*p);实参用指针变量,形参用数组例将数组a中的n个整数按相反顺序存放 C8.5指针与字符串8.5.1字符串表示形式用字符数组实现例main()charstring=“IloveChina!”;printf(“%sn”,string);printf(“%sn”,string+7);IloveChistring0string1string2string3string

37、4string5string6string7string8string9stringstring10string11string12string13n!a0C用字符指针实现例main()char*string=“IloveChina!”;printf(“%sn”,string);string+=7;while(*string)putchar(string0);string+;IloveChistringn!a0字符指针初始化:把字符串首地址赋给stringchar*string;string=“IloveChina!”;stringC例:将字符串a复制到字符串b字符数组作参数main()cha

38、ra=Iamaboy.;charb20;inti;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);*(b+i)=0;printf(stringais:%sn,a);printf(stringbis:);for(i=0;bi!=0;i+)printf(%c,bi);printf(n);C将字符串a复制到字符串b用指针处理main()chara=Iamaboy.,b20,*p1,*p2;inti;p1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(stringais:%sn,a);printf(stringbis:);for(

39、i=0;bi!=0;i+)printf(%c,bi);printf(n);C字符串指针作函数参数将一个字符串从一个函数传递到另一个函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以下四种情况:实参形参1数组名数组名2数组名字符指针变量3字符指针变量字符指针变量4字符指针变量数组名C例 用函数调用实现字符串复制(1)用字符数组作参数(2)用字符指针变量作参数aIamateaceh0r.fromabyuarasutndetoboet.0Iaaeceh0r.t.0mtavoidcopy_string(charfrom,charto)inti=0;while(fromi!=0)toi

40、=fromi;i+;toi=0;main()chara=Iamateacher.;charb=Youareastudent.;printf(string_a=%snstring_b=%sn,a,b);copy_string(a,b);printf(nstring_a=%snstring_b=%sn,a,b);voidcopy_string(char*from,char*to)for(;*from!=0;from+,to+)*to=*from;*to=0;main()char*a=Iamateacher.;char*b=Youareastudent.;printf(string_a=%snstr

41、ing_b=%sn,a,b);copy_string(a,b);printf(nstring_a=%snstring_b=%sn,a,b);C对copy_string函数的几种简化-:voidcopy_string(char*from,char*to)while(*to=*from)!=0)to+;from+*to=*from是一个赋值表达式,其值等于*from。to+和from+分别使指针指向下一个字节。先执行赋值表达式,再判赋值表达式的值(等于*from)是否为0,因此,from串中的结尾字符0被赋值给to。C对copy_string函数的几种简化-:Voidcopy_string(cha

42、r*from,char*to)while(*to+=*from+)!=0);*to+=*from+先执行*to=*from,再使to、from分别加1。C对copy_string函数的几种简化-:Voidcopy_string(char*from,char*to)while(*from!=0)*to+=*from+;*to=0;当遇到*from=0时,不执行赋值运算*to+=*from+,因此,最后应加一句*to=0C对copy_string函数的几种简化-:Voidcopy_string(char*from,char*to)while(*to+=*from+);与第种简化相同,当*from=

43、0时,表达式*to+=*from+的值等于0(假),结束while循环。C对copy_string函数的几种简化-:Voidcopy_string(char*from,char*to)for(;(*to+=*from+)!=0;);或for(;*to+=*from+;);for循环的结束条件是表达式*to+=*from+的值(即*from的值)等于0。且form中的0已被赋给to。注意0的ASCII码是不是0。C对copy_string函数的几种简化-:Voidcopy_string(charfrom,charto)char*p1,*p2;p1=from;p2=to;while(*p2+=p1

44、+)!=0)形参用数组,使用局部指针变量指向形参数组C字符指针变量与字符数组char*cp;与charstr20;str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址charstr20;str=“IloveChina!”;()char*cp;cp=“IloveChina!”;()str是地址常量;cp是地址变量cp接受键入字符串时,必须先开辟存储空间例charstr10;scanf(“%s”,str);()而char*cp;scanf(“%s”,cp);()改为:char*cp,str10;cp=str;scanf(“%s”,cp);()C字符串与数组关系字符串用一维字符数组存放

45、字符数组具有一维数组的所有特点数组名是指向数组首地址的地址常量数组元素的引用方法可用指针法和下标法数组名作函数参数是地址传递等区别存储格式:字符串结束标志赋值方式与初始化输入输出方式:%s%cCcharstr=“Hello!”;()charstr=“Hello!”;()charstr=H,e,l,l,o,!;()char*cp=“Hello”;()inta=1,2,3,4,5;()int*p=1,2,3,4,5;()charstr10,*cp;inta10,*p;str=“Hello”;()cp=“Hello!”;()a=1,2,3,4,5;()p=1,2,3,4,5;()C字符数组字符指针变

46、量组成若干元素组成,每个元素中放一个字符。2或4字节,存放字符串的首地址。赋初值方式staticcharstr=IloveChina!;char*a=IloveChina!;赋值方式charstr14;str=IloveChina!char*a;a=IloveChina!;占用内存字符数组一个元素占一字节内存,且在编译时分配。指针变量中只可以放一个地址值(近指针=2字节,远指针=4字节)。且编译时未指定charstr10;scanf(%s,str);char*a;scanf(%s,a);a尚未指向任何变量C8.6指针与多维数组多维数组的地址二维数组staticinta34=1,3,5,7,9,

47、11,13,15,17,19,21,23;理解为:有三个元素a0、a1、a2,每一个元素代表一行,每一个元素是一个包含4个元素的数组。1357911131517192123a0a1a2C多维数组的地址1357911131517192123aa+1a+2200020022004200620082010201220142016201820202022a0+1a0+2a0+3C指向多维数组的指针变量例:用指针变量输出数组元素的值。main()staticinta34=1,3,5,7,9,11,13,15,17,19,21,23;int*p;for(p=a0;pa0+12;p+)if(p-a0)%4=

48、0)printf(n);printf(%4d,*p);C指向多维数组的指针变量注意:本例用指针顺序访问二维数组的元素。若需访问二维数组anm(n行m列)的某个元素aij,计算该元素的相对位置公式为:i*m+j(i,j=0,1,2,.)这种方法相当于把二维数组转化为一维数组来使用。C指向多维数组的指针变量直接用二维数组下标访问元素:main()staticinta34=1,3,5,7,9,11,13,15,17,19,21,23;inti,j;for(i=0;i3;i+)for(j=0;jy)z=x;elsez=y;return(z);main()intmax(int,int),(*p)();i

49、nta,b,c;p=max;scanf(%d,%d,&a,&b);c=(*p)(a,b);printf(a=%d,b=%d,max=%dn,a,b,c);intmax(intx,inty)intz;if(xy)z=x;elsez=y;return(z);C指向函数的指针变量函数指针变量赋值:如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数定义形式:数据类型(*指针变量名)(形参类型);如int(*p)();函数指针变量指向的函数必须有函数说明函数调用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);对函数指针变量pn,p+,p-无意义C例

50、 用函数指针变量作参数,求最大值、最小值和两数之和voidmain()inta,b;intmax(int,int),min(int,int),add(int,int);voidprocess(int,int,int(*fun)();scanf(%d,%d,&a,&b);process(a,b,max);process(a,b,min);process(a,b,add);voidprocess(intx,inty,int(*fun)()intresult;result=(*fun)(x,y);printf(%dn,result);max(intx,inty)printf(“max=”);prin

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com