C++课件(2013-6) 指针_第1页
C++课件(2013-6) 指针_第2页
C++课件(2013-6) 指针_第3页
C++课件(2013-6) 指针_第4页
C++课件(2013-6) 指针_第5页
已阅读5页,还剩165页未读 继续免费阅读

下载本文档

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

文档简介

1、1第六章第六章 指针指针2指针的概念 数据在内存中是如何存取的?数据在内存中是如何存取的? 系统根据程序中定义变量的类型,给变量分配一定的长系统根据程序中定义变量的类型,给变量分配一定的长度空间。字符型占度空间。字符型占1个字节,整型数占个字节,整型数占4个字节个字节.。内存区。内存区的每个字节都有编号,称之为的每个字节都有编号,称之为地址地址。2000H2001H2002H2003H2004H35内存内存内存单元的内存单元的地址地址内存单元的内存单元的内容内容31、直接访问 按变量地址存取变量的值。按变量地址存取变量的值。cini; 实际上放到定实际上放到定义义 i 单元的单元的地址中地址中

2、。i42、间接访问 将变量的地址存放在另一个单元将变量的地址存放在另一个单元p中中,通过,通过 p 取出变取出变量的地址,再针对变量操作。量的地址,再针对变量操作。 一个变量的地址称为该变量的指针。一个变量的地址称为该变量的指针。i2000H2000H3000Hp5变量的指针和指向变量的指针变量 变量的指针就是变量的指针就是变量的地址变量的地址,当变量定义后,其指当变量定义后,其指针(地址)是一常量。针(地址)是一常量。 i2000Hint i; &i :2000H 6 可以可以定义一个变量定义一个变量专门用来专门用来存放存放另一变量的另一变量的地址地址,这种变量我们称之为这种变量我们

3、称之为指针变量指针变量。在编译时同样分配。在编译时同样分配一定字节的存储单元,未赋初值时,该存储单元内一定字节的存储单元,未赋初值时,该存储单元内的值是的值是随机随机的。的。 指针变量定义的一般形式为:指针变量定义的一般形式为:类型标识符类型标识符 *变量名变量名int *i_point;指针类型指针类型变量名变量名7指针指针变量变量同样也可以赋值:同样也可以赋值:int i, *i_point;i_point=&i; 也可以在定义也可以在定义指针变量指针变量时赋初值:时赋初值:int i;int *i_point=&i;3000H i_point2000H i2000H8 *

4、 在在定义语句定义语句中只表示变量的类型是指针,没有任何中只表示变量的类型是指针,没有任何计算意义。计算意义。 * 在语句中表示在语句中表示“指向指向”。&表示表示“地址地址”。 一个指针变量只能指向同一类型的变量一个指针变量只能指向同一类型的变量。即整型指。即整型指针变量只能放整型数据的地址,而不能放其它类型数针变量只能放整型数据的地址,而不能放其它类型数据的地址。据的地址。92000H2000H3000H i_pointint i;int *i_point=&i;*i_point=3;表示表示指向指向表示表示类型类型i310指针变量的引用 指针变量只能指针变量只能存放地址存

5、放地址,不要将非地址数据赋给指,不要将非地址数据赋给指针变量。针变量。int *p, i; p=100; p=&i;非法非法11void main(void) int a=10, b=100; int *p1, *p2; p1=&a; p2=&b; coutatbendl; cout*p1t*p2endl; 10010bap1p2&b&a指针变量赋值指针变量赋值指针变量引用指针变量引用10 10010 100表示表示指向指向12void main(void) int a, b; int *p1, *p2; p1=&a; p2=&b; *p

6、1=10; *p2=100; coutatbendl; cout*p1t*p2endl; bap1p2&b&a10010通过指针对通过指针对变量赋值变量赋值指针变量赋值指针变量赋值指针变量引用指针变量引用13void main(void) int a, b; int *p1, *p2; *p1=10; *p2=100; coutatbendl; cout*p1t*p2ab; p1=&a; p2=&b; if (ab) p=p1; p1=p2; p2=p; coutatbendl; cout*p1t*p2ab; point1=&a; point2=&

7、;b; if (ab) swap (point1, point2); cout“a=“a“,b=”bendl; cout*point1“,”*point2ab; point1=&a; point2=&b; if (ab) swap (a, b); cout“a=“a“,b=”bn; cout*point1t*point2;swap(int x, int y) int t; t=x; x=y; y=t;x10y100t10a10point1&ab100point2&b10010 x=100y=10输出:输出:a=10,b=100 10,100值传递值传递18 用指

8、针变量作函数参数,在被调函数的执行过程中,用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,应使指针变量所指向的参数值发生变化,这样,函数这样,函数在调用结束后,其变化值才能保留回主调函数。在调用结束后,其变化值才能保留回主调函数。 用指针变量作函数参数,可以得到多个变化了的值。用指针变量作函数参数,可以得到多个变化了的值。 函数调用函数调用不能改变实参指针变量的值,但不能改变实参指针变量的值,但可以改变可以改变实参指针变量所指向变量的值实参指针变量所指向变量的值。int s( int *p) int sum=10; sum=sum + *p; return s

9、um; 19void main(void) int a=0, i, *p, sum; for (i=0; i*p; sum=s(p); cout“sum=”sumendl; 输入:输入:1 3 5sum=11sum=13sum=15p&aa1p&asum10sum111120sub( int *s) static int t=0; t=*s + t; return t; void main(void) int i, k; for (i=0; i4; i+) k=sub(&i); cout“sum=“kt; cout“n”;i=0 t=*s+t=0 k=0 sum=0i=

10、1 t=*s+t=1 k=1 sum=1i=2 t=*s+t=3 k=3 sum=3i=3 t=*s+t=6 k=6 sum=6sum=0sum=1sum=3sum=621int *p;void main(void) int a=1, b=2, c=3; p=&b; pp(a+c, &b); cout“(1)”a b *pendl;pp(int a, int *b) int c=4; *p=*b+c; a=*p-c; cout“(2)”a *b *pendl;*p=*b+4=2+4=6a=6-c=2(2) 2 6 6(1) 1 6 6b2p&bb&ba422数组

11、的指针和指向数组的指针变量 数组与变量一样,在内存中占据单元,有地址,一数组与变量一样,在内存中占据单元,有地址,一样可以用指针来表示。样可以用指针来表示。C+规定:规定:数组名就是数组的数组名就是数组的起始地址起始地址;又规定:;又规定:数组的指针就是数组的起始地址数组的指针就是数组的起始地址。数组元素的指针就是数组元素的地址。数组元素的指针就是数组元素的地址。23一、指向数组元素的指针变量的定义与赋值int a10, *p;p=&a0; p=a;p是变量,是变量,a为常量。为常量。2024H2020H201CH2018H2014H2010H200CH2008H2004H2000Ha

12、9a8a7a6a5a4a3a2a1a0ap&a0若数组元素为若数组元素为int型,则指向其的指针变量型,则指向其的指针变量也应定义为也应定义为int型。型。int a10;int *p=a; int *p=&a0;数组第一个元素的地址数组第一个元素的地址直接用数组名赋值直接用数组名赋值这两种情况均为赋初值这两种情况均为赋初值24二、通过指针引用数组元素int a10;int *p=a; 2024H2020H201CH2018H2014H2010H200CH2008H2004H2000Ha9a8a7a6a5a4a3a2a1a0ap&a0*p=1; a0=1; 1 C+C+

13、规定,规定,p+1p+1指向数组的指向数组的下一个元素下一个元素,而不是下一个字节。而不是下一个字节。*(p+1)=2;a1=2;2*+p=2;p=p+1; *p=2; p=2004H为指针变为指针变量赋初值量赋初值通过指针变量为通过指针变量为数组元素赋值数组元素赋值指针变量也重新赋值指针变量也重新赋值25*(a+1)=2;*(a+1)与与a1等同。等同。*+a=2;a为常量,不可赋值。为常量,不可赋值。p+i 或或 a+i 均表示均表示 ai 的地址的地址 &ai2024H2020H201CH2018H2014H2010H200CH2008H2004H2000Ha9a8a7a6a5a

14、4a3a2a1a0ap&a012*(p+1)=2;a1=2;*+p=2;错误错误*(a+i)ai*(p+i)pip=p+1; *p=2; p=2004H26用指向数组的指针变量输出数组的全部元素void main(void) int a10, i; int *p; for (i=0; iai; for (p=a; pa+10; p+) cout*pt;void main(void) int a10, i; int *p=a; for (i=0; iai; for (i=0; i10; i+) cout*p+t;输入数组元素输入数组元素指针变量赋初值指针变量赋初值指向下一元素指向下一元素

15、输出指针指向的数据输出指针指向的数据*p, p=p+1输出数据后指针加输出数据后指针加127int a=3, *p;p=&a;+, - -, * 优先级相同,都是自右向左结合性。优先级相同,都是自右向左结合性。相当于相当于a+。表达式为。表达式为3, a=47532008H2004H2000Ha&ap(*p)+; 428int a=3, *p;p=&a;7532008H2004H2000Ha&ap2004H*p+首先首先*p ,然后,然后p=p+1, 指针指向下一指针指向下一个个int单元单元 表达式为表达式为3, p=2004H。*p+; +, - -, *

16、优先级相同,都是自右向左结合性。优先级相同,都是自右向左结合性。29int a=3, *p;p=&a;7532008H2004H2000Ha&ap4+(*p) *p=*p+1 a=4+*p+, - -, * 优先级相同,都是自右向左结合性。优先级相同,都是自右向左结合性。30int a=3, *p;p=&a;p7532008H2004H2000Ha&a2004H*(+p),首先:,首先:p=p+1, 然后取然后取*p。即取。即取p所指所指的下一个的下一个int单元的内容。单元的内容。表达式为表达式为5 p2004H*+p +, - -, * 优先级相同,都是自右

17、向左结合性。优先级相同,都是自右向左结合性。31static int a =1, 3, 5, 7, 11, 13;main( ) int *p; p=a+3; cout*pt(*p+)endl; cout*(p-2)t*(a+4)endl;7 75 1113571113a0a1a2a3a4a5p&a332void main(void) int x =1,2,3; int s, i, *p; s=1; p=x; for (i=0; i3; i+) s*=*(p+i); coutsendl; 6321xpi=0s=s*(*(p+0)=s*1=1i=1s=s*(*(p+1)=s*2=2i=2

18、s=s*(*(p+2)=s*3=6p+1p+233三、数组名作函数参数 数组名可以作函数的实参和形参,传递的是数组名可以作函数的实参和形参,传递的是数组的数组的地址地址。这样,。这样,实参、形参共同指向同一段内存单元实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调内存单元中的数据发生变化,这种变化会反应到主调函数内。函数内。 在函数调用时,在函数调用时,形参数组并没有另外开辟新的存储形参数组并没有另外开辟新的存储单元单元,而是以实参数组的首地址作为形参数组的首地,而是以实参数组的首地址作为形参数组的首地址。址。这样形参数组的元素值发生了变化也就使实参数这样形参数

19、组的元素值发生了变化也就使实参数组的元素值发生了变化组的元素值发生了变化。34void main(void) int array10; . f(array, 10); .f(int arr , int n) .实参数组实参数组形参数组形参数组,必须进行类型说明必须进行类型说明用数组名作形参,因为接收的是地址,所以用数组名作形参,因为接收的是地址,所以可以不指定具体的元素个数。可以不指定具体的元素个数。1、形参实参都用数组名352028H2024H2020H201CH2014H2010H200CH2008H2004H2000Harray9array8array7array6array5array

20、4array3array2array1array0array,arrarr0指向同一存指向同一存储区间储区间362、实参用数组名,形参用指针变量、实参用数组名,形参用指针变量void main(void) int a 10; . f(a, 10); .f(int *x, int n ) .实参数组实参数组形参指针形参指针373、形参实参都用指针变量void main(void) int a 10,*p; p=a; . f(p, 10); .f(int *x, int n ) .实参指针实参指针形参指针形参指针实参指针变量调用前必须赋值实参指针变量调用前必须赋值384、实参为指针变量,形参为数组

21、名、实参为指针变量,形参为数组名void main(void) int a 10,*p; p=a; . f(p, 10); .f(int x , int n ) .实参指针实参指针形参数组形参数组39将数组中的n个数按相反顺序存放。void inv(int x , int n) int t, i, j, m=(n-1)/2; for (i=0;i=m; i+) j=n-1-i; t=xi; xi=xj; xj=t; void main(void) int i, a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); for (i=0;i10; i+) coutait;2457

22、60119x9x8x7x6x5x4x3x2x1x0a9a8a7a6a5a4a3a2a1a0 x, a37x与与a数组指向同一段内存数组指向同一段内存40void inv(int *x, int n) int *p, t, *i, *j, m=(n-1)/2; i=x; j=x+n-1; p=x+m; for (; i=p; i+,j-) t=*i; *i=*j; *j=t; void main(void) int i, a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); for (i=0;i10; i+) coutait;用指针变量来用指针变量来接受地址接受地址24576

23、0119x9x8x7x6x5x4x3x2x1x0a9a8a7a6a5a4a3a2a1a0 x, a37ijp41 编写函数编写函数 int fun(int x, int *pp), 其功能是,求出能其功能是,求出能整除整除x且不是偶数的各整数,并按照从小到大的顺序放且不是偶数的各整数,并按照从小到大的顺序放在在pp指向的内存中,函数返回值为这些整数的个数。指向的内存中,函数返回值为这些整数的个数。若若x的值为的值为30, 数组中的数为数组中的数为1,3,5,15,函数返回,函数返回4。42int fun(int x, int *pp) int k=0; for(int i=1;ix; n=fu

24、n(x,a); for(int i=0;in;i+) coutait; coutendl;43四、指向多维数组的指针和指针变量 用指针变量也可以指向多维数组,表示的同样是多维数组的首地用指针变量也可以指向多维数组,表示的同样是多维数组的首地址。址。int a34; /首地址为首地址为2000H a23a22a21a20a13a12a11a10a03a02a01a00200CH2008H2004H2000Haa2a1a02000H2010H2020H 可以将可以将a数组看作一个一维数组,这个一维数组的数组看作一个一维数组,这个一维数组的每个元素每个元素又是一个具有又是一个具有4个个int型数据的

25、一维数组型数据的一维数组,这样,这样,我们就可以利我们就可以利用一维数组的概念来用一维数组的概念来标记标记一些写法。一些写法。a00 a01 a02 a03 a10 a11a12a13 a20 a21 a22 a232000H2008H2010H 2014H201cH 2020H2028H 202cH44a0=*(a+0)a+0为为a0的地址的地址&a0,其值为,其值为2000H。a1=*(a+1)a+1为为a1的地址的地址&a1,其值为,其值为2010H。a2=*(a+2)a+2为为a2的地址的地址&a2,其值为,其值为2020H。a23a22a21a20a13a12

26、a11a10a03a02a01a00200CH2008H2004H2000Haa2a1a02000H2010H2020H a0为一维数组名为一维数组名,其数组有四个,其数组有四个int型的元素:型的元素: a00,a01,a02,a03同样,同样,a0代表一维数组的首地址,所以,代表一维数组的首地址,所以,a0为为&a00。45a23a22a21a20a13a12a11a10a03a02a01a00200CH2008H2004H2000H2020H2010H2000Haa2a1a0a0代表一维数组的首地址代表一维数组的首地址,也就是也就是一维数组名一维数组名,a0为为&a00。

27、a0为为&a00a00=*(a0+0)b0 = *(b+0)a0+1为为&a01a01=*(a0+1)b1 = *(b+1)a0+2为为&a02a02=*(a0+2)b2 = *(b+2)a0+3为为&a03a03=*(a0+3)b3 = *(b+3)a1+2为为&a12 a12=*(a1+2)行行列列把把a0看成看成一维数组一维数组baij=*(ai+j)46a为二维数组名为二维数组名,a+1为为a1的的地址地址,也就是数组第,也就是数组第一行的地址,所以一行的地址,所以a为为行指针行指针。a1为一维数组名为一维数组名,a1+1为为a11的的地址地址,

28、也就是,也就是数组第一行第一列的地址,所以数组第一行第一列的地址,所以a1为为列指针列指针。a23a22a21a20a13a12a11a10a03a02a01a00200CH2008H2004H2000H2020H2010H2000Haa2a1a0a1+2为为&a12 a12=*(a1+2)行行列列aij=*(ai+j)47可以看到:可以看到:a, a+0 , *(a+0), a0, &a00表示的都表示的都是是2000H,即二维数组的首地址。,即二维数组的首地址。 实际上,实际上,a0, a1, a2并不是并不是实际的元素实际的元素,它们在,它们在内存内存并不占具体的存储单元

29、并不占具体的存储单元,只是为了我们表示方,只是为了我们表示方便起见而设计出的一种表示方式。便起见而设计出的一种表示方式。a为行指针,加为行指针,加1移动一行。移动一行。*a或或a0为列指针,加为列指针,加1移动一列。移动一列。a23a22a21a20a13a12a11a10a03a02a01a00200CH2008H2004H2000H2020H2010H2000Haa2a1a048a1=*(a+1)*(a+1)+2=&a12*(*(a+1)+2)=a12*(a+1)=*(a1)=*(*(a+1)+0)=a10(*(a+1)1=*(*(a+1)+1)=a11*(a+1)1=*(a+1)

30、1)=*(*(a+1)+1)=*(a+2)=a20注意二维数组的各种表示法,注意二维数组的各种表示法,a为常量。为常量。a23a22a21a20a13a12a11a10a03a02a01a00200CH2008H2004H2000H2020H2010H2000Haa2a1a049int a34=1,3,5,7,9,11,13,15,17,19,21,23;设数组的首地址为设数组的首地址为1900H,则:,则: a为为_ *a为为_ a+2为为_ *a+2为为_*(a+1)+2为为_ *a为为_ *(*a+9)为为_ (a+1)1为为_ 1908H1900H1920H1900H1918H1191

31、920Ha23a22a21a20a13a12a11a10a03a02a01a00190CH1908H1904H1900H1920H1910H1900Haa2a1a050void main(void) static int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=a0; pa0+12 ; p+) if(p-a0)%4= =0) coutendl; cout*pt; a00a01a02a03a10a11a12pp+1 a0+11357911131517192123 for(p=a; pa+12 ; p+)a0是列指针是列指针类型不匹配!类

32、型不匹配!a+151a00a01a02a03a10a11a12a13pint a34,*p;如何用如何用p表示二维数组中的任一元素?表示二维数组中的任一元素?p=a0*p *(a0+0) a00p+1*(a0+1) a01p+2*(a0+2) a02p+3*(a0+3) a03p+4*(a0+4) a10 *(p+4*1+0)p+5*(a0+5) a11 *(p+4*1+1)aij*(p+4*i+j) *(p+m*i+j)m为第二维的维数。是个常数为第二维的维数。是个常数p+2p+452fun(int *q1, int *q2, int *q3) *q3=*q2+*q1; void main

33、( void) int i , j, a33=1,1,*p1,*p2,*p3;p1=a0, p2=a0+1,p3=a0+2;for(i=2;i9;i+) fun(p1+, p2+, p3+);for(i=0;i3; i+) for(j=0;j3;j+) coutaijt; coutendl;程序输出的第一行为程序输出的第一行为_第二行为第二行为_ 第三行为第三行为_11p1p2p3i=2 *q3=2i=3 *q3=3i=4 *q3=523511253指向由指向由m个整数组成的个整数组成的一维数组一维数组的指针变量的指针变量int (*p)m;int (*p)4, a4;app+1指针加指针加1

34、6个字节个字节。a+1指针加指针加4个字节个字节。a+1p+1指向下一行指向下一行54int (*p)4, a34;a23a22a21a20a13a12a11a10a03a02a01a00200CH2008H2004H2000Hpp+1p+2p为行指针为行指针,可以直接将二维数组名,可以直接将二维数组名a赋给赋给p。这样,。这样,a与与p等同等同。a23 *(*(a+2)+3) p23 *(*(p+2)+3) apa两种表示两种表示完全等价完全等价a为常量为常量p为变量为变量55若有以下的定义和语句,则下面各个符号的若有以下的定义和语句,则下面各个符号的正确含义是:正确含义是:int a34

35、, (*p)4;p=a;1.p+12.*(p+2) 3.*(p+1)+24.*(*p+2) a23a22a21a20a13a12a11a10a03a02a01a00200CH2008H2004H2000Hpp+1p+2aa数组第一行元素的首地址数组第一行元素的首地址为行指针为行指针a数组第二行元素的首地址数组第二行元素的首地址为列指针为列指针&a20&a12为列指针为列指针数据元素数据元素*(*(p+0)+2)=a0256若有以下的定义和语句,则对若有以下的定义和语句,则对a数组元素的非数组元素的非法引用是:法引用是:int a23, (*pt)3;pt=a;1)pt00 2)

36、 *(pt+1)23) *(pt1+2) 3) *(a0+2)*(pt+1)2 右结合性右结合性*(pt+1)2)*(*(pt+1+2)*(*(pt+3)=pt3057多维数组的指针作函数参数多维数组的指针作函数参数主要注意的是函数的主要注意的是函数的实参实参究竟是行指针还是究竟是行指针还是列指针,从而决定函数列指针,从而决定函数形参形参的类型。的类型。要求要求实实参、形参一一对应,类型一致参、形参一一对应,类型一致。(举例)。(举例)58求二维数组求二维数组a34的平均值。的平均值。void main(void) float score34 = 65,67,70 ,60, 80,87,90,

37、81, 90,99,100,98 ; float sum=0; for(int i=0;i3;i+) for(int j=0;j4;j+) sum=sum+scoreij; cout“aver=“sum/12endl;59void main(void) float score34 = 65,67,70 ,60, 80,87,90,81, 90,99,100,98 ;float aver; aver=fun1(score, 3); aver=fun2(*score, 12);p 161 8.1560字符串的字符串的指针指针和指向字符串的和指向字符串的指针变量指针变量字符串的表示形式字符串的表示形

38、式1、用字符数组实现、用字符数组实现void main(void ) char string =“I love China”; coutstring;I l o v eC h i n a 0stringstring为数组名,代表数组的首地址,是常量。为数组名,代表数组的首地址,是常量。数组首地址数组首地址61char string20;string=“I love China”;strcpy(string, “I love China”);cin.getline(string); /从键盘输入从键盘输入0anihCevolI string错误!常量不错误!常量不能赋值能赋值正确赋值形式正确赋值

39、形式622、用字符、用字符指针指针表示字符串表示字符串void main(void) char *string=“I love China”; coutstring;I l o v eC h i n a 0string字符串常量字符串常量指针变量指针变量将内存中字符串常量的首地址赋给一个指针变量将内存中字符串常量的首地址赋给一个指针变量63void main(void) char *string; string=“I love China”;*string=“I love China”;char *string; cin.getline(string);指针变量赋值,合法指针变量赋值,合法具体

40、字符具体字符指针未赋值就作指向运算指针未赋值就作指向运算64将字符串将字符串a复制到字符串复制到字符串b。void main(void) char a =“I am a boy”, b20; int i; for(i=0; *(a+i)!=0; i+) *(b+i)=*(a+i); *(b+i)=0; coutaendl; coutbendl;Ia mab oy 0abi=0 *(b+i)=*(a+i)bi=aiIi=1i=2ay 0必须以必须以0结束结束65void main(void) char a =“I am a boy”, b20; char *p1, *p2; int i; p1=

41、a; p2=b; for(; *p1!=0; p1+,p2+) *p2=*p1; *p2=0; coutaendl; coutbendl;Ia mab o y 0abp1ap2b*p2=*p1Ia+1p1b+1p2p1p20必须以必须以0结束结束y66void main(void) char a =“I am a boy”, b20; char *p1, *p2; int i; p1=a; p2=b; for(; *p1!=0; p1+,p2+) *p2=*p1; *p2=0; coutaendl; coutbendl;for(; *p1!=0; ) *p2+=*p1+;*p2=0; whil

42、e(*p2+=*p1+);for(; *p2+=*p1+ ; );for(; (*p2+=*p1+)!=0 ; );67以下程序判断输入的字符串是否以下程序判断输入的字符串是否“回文回文”,若是回文,输出,若是回文,输出YES。void main(void) char s81, cr, *pi, *pj; int i, j, n; cin.getline(s); n=strlen(s); pi=_; pj=_;/pi指向串开始,指向串开始,pj指向最后指向最后 while(*pi= ) _; while(*pj= ) _; while( ( _) &(*pi=*pj) ) pi+; _

43、; if(pipj) cout“NO”endl; else cout“YESn”;ss+n-1pi+pj-pj-pipj68字符串字符串指针指针作函数参数作函数参数将一个字符串从一个函数传递到另一个函数,将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法。即用可以用地址传递的办法。即用字符数组名作字符数组名作参数或用指向字符串的指针变量作参数参数或用指向字符串的指针变量作参数。在。在被调函数中可以改变原字符串的内容。被调函数中可以改变原字符串的内容。69将字符串将字符串a复制到字符串复制到字符串b。void main(void) char a =“I am a teacher”; c

44、har b =“You are a student”; copy_string(a , b); coutaendl; coutbendl;copy_string( char from,char to) int i; for (i=0; fromi!=0; i+) toi=fromi; toi=0; abfromtofrom与与a一个地址,一个地址,to与与b一个地址一个地址70将字符串将字符串a复制到字符串复制到字符串b。void main(void) char a =“I am a teacher”; char b =“You are a student”; copy_string(a,b)

45、; coutaendl; coutbendl;copy_string(char *from, char *to) for ( ; *from!=0; ) *to+=*from+; *to=0; for(; *from+=*to+; ) ;也可以用字符指针来接受数组名也可以用字符指针来接受数组名abfromto71字符指针变量与字符数组字符指针变量与字符数组字符字符数组数组和字符和字符指针变量指针变量都可以实现字符串的存储都可以实现字符串的存储和运算,区别在于:和运算,区别在于:字符数组名是常量字符数组名是常量,定义时必须指明占用的空间大,定义时必须指明占用的空间大小。小。字符指针变量是变量字符

46、指针变量是变量,里面存储的是字符型地址,里面存储的是字符型地址,可以整体赋值,可以整体赋值,但字符串必须以但字符串必须以0结尾结尾。72void main(void) char str80= “hcance”; fun(str); coutstr0) swap(s1,s2); if(strcmp(s2,s3)0) swap(s2,s3); if(strcmp(s1,s2)0) swap(s1,s2); couts1endls2endls3m; fun(str1,str2,m); coutstr2endl; 75void fun(char *p1, char *p2, int m) int n=

47、strlen(p1); if(nm) cout“No transn”;*p2=0; return; for(int i=m, p1=p1+m-1; iy?x:y;这时,指针变量这时,指针变量p中放的是中放的是max函数在内存中的入口地址。函数在内存中的入口地址。函数类型函数类型 (*指针变量名指针变量名)(参数类型参数类型 );int (*p)( int, int);专门存放函数地址的专门存放函数地址的指针变量指针变量称为称为指向函数的指针指向函数的指针变量变量。p空间的内容只能空间的内容只能放函数的地址放函数的地址且该函数的返回值为整型数且该函数的返回值为整型数同时该函数具有两个整型形参同时

48、该函数具有两个整型形参78函数名函数名max代表函数在内存中的入口地址,代表函数在内存中的入口地址,是一个是一个常量常量,不可被赋值。,不可被赋值。而指向函数的指针变量而指向函数的指针变量 p 可以先后指向不同的可以先后指向不同的同种同种类型类型的函数。但不可作加减运算。的函数。但不可作加减运算。p=max;p=min;int (*p)( int , int);定义定义赋值赋值79如何用指向函数的指针变量调用函数?如何用指向函数的指针变量调用函数?int max(int x, int y) return xy?x:y; void main(void) int a, b, c; cinab; c

49、=max(a,b); coutcy?x:y; void main(void) int a, b, c,max(int,int); int (*p)(int, int ); p=max ; cinab; c=p(a,b); coutcendl;给指针变给指针变量赋值量赋值通过指针通过指针变量调用变量调用一般的调一般的调用方法用方法定义指向函数定义指向函数的指针变量的指针变量实际上就是用实际上就是用p替换函数名替换函数名c=(*p)(a,b)80用二分法求方程的解。用二分法求方程的解。f1(x)=x2-3指向函数的指针变量作指向函数的指针变量作函数参数函数参数(实现通用函数)(实现通用函数)81二

50、分法求解方程二分法求解方程f(x)xyx01、在、在x轴上取两点轴上取两点x1和和x2, 要确保要确保x1与与x2之间有且只有方程之间有且只有方程唯一的解唯一的解。x1x2x02、做、做x0=(x1+x2)/2。3、若、若|f(x0)|满足给定的精度,则满足给定的精度,则x0即是方程的解,否则,即是方程的解,否则,若若f(x0)*f(x1)0,则方程的解应在,则方程的解应在x2与与x0之间,令之间,令x1=x0,继续做,继续做2 ,直至满足精度为止。直至满足精度为止。x2x0 x2= x0 x0=(x1+x2)/282用二分法求方程的解。用二分法求方程的解。f1(x)=x2-3void mai

51、n(void) float x1, x2, x0; do coutx1x2; while (f1(x1)*f1(x2)0);float f1(float x)return x*x-3;do x0=(x1+x2)/2; if ( (f1(x1)*f1(x0) =1e-6);coutx0endl; 判断判断x1与与x2之间之间是否有方程根是否有方程根输入初值输入初值求中值求中值循环迭代循环迭代循环结束条件循环结束条件已知已知x求求f1(x)83当求解方程当求解方程f2(x)=3x2-5x-3时,同样时,同样main( ) float x1, x2, x0; do coutx1x2; while (

52、f2(x1)*f2(x2)0);float f2(float x)return 3*x*x-5*x-3;do x0=(x1+x2)/2; if ( (f2(x1)*f2(x0) =1e-6);coutx0endl; 可以看到,虽然算法相同,仅是可以看到,虽然算法相同,仅是方程方程不同,两个程序不能不同,两个程序不能通用。通用。可以用指向函数的指针变量,设计相同算法的可以用指向函数的指针变量,设计相同算法的通用函数通用函数。84float devide(float (*fun)(float ) float x1, x2, x0; do coutx1x2; while ( fun(x1) * fu

53、n(x2) 0); do x0=(x1+x2)/2; if ( fun(x1) * fun(x0) =1e-6);return x0;float f1(float x)return x*x-3;float f2(float x)return 3*x*x-5*x-3;main( ) float y1,y2; y1=devide(f1); y2=devide(f2); couty1t y2;调用函数调用函数,实参为函实参为函数名数名f1形参用指向函数形参用指向函数的指针变量的指针变量fun接受函数名接受函数名用用fun调用函调用函数,实际调用数,实际调用的是实参函数的是实参函数85实参:实际的函数

54、名(函数地址)实参:实际的函数名(函数地址)形参:指向函数的指针变量形参:指向函数的指针变量与实参函数的类型完全一致(返回值、参数)与实参函数的类型完全一致(返回值、参数)通用函数:所有的内部函数调用都用通用函数:所有的内部函数调用都用函数指针调用函数指针调用86梯形法求定积分的公式梯形法求定积分的公式abf(a)f(b)分成分成n份,每份长度份,每份长度h=(b-a)/n积分结果为曲线与积分结果为曲线与x轴之间轴之间部分的面积,也即为每份部分的面积,也即为每份面积之和。面积之和。S=(上底下底)上底下底)*高高/2= (f(a+i*h)+f(a+(i+1)*h)*h/2其中其中 i=0(n-

55、1) a+n*h=b任意一份:高:任意一份:高:h上底:上底:f(a+i*h)a+i*h下底:下底:f(a+(i+1)*h)87S= (f(a)+f(b)/2+ f(a+i*h) *h (i=1(n-1)将上式展开,除将上式展开,除f(a),f(b)外,每一底边都参与运算两次,所以有:外,每一底边都参与运算两次,所以有:y=(f(a)+f(b)/2;h=(b-a)/n;for(i=1;in;i+) y=y+f(a+i*h);y=y*h;可利用这一公式,计算所有函可利用这一公式,计算所有函数的定积分,也即做成通用公数的定积分,也即做成通用公式,具体的函数由式,具体的函数由指向函数的指向函数的指针

56、变量来代替,指针变量来代替,在主调函数在主调函数中为这个指针变量赋值。中为这个指针变量赋值。S=(上底下底)上底下底)*高高/2= (f(a+i*h)+f(a+(i+1)*h)*h/2其中其中 i=0(n-1) a+n*h=b初值初值计算累加和计算累加和88float jifen(float (*pf)(float ), float a, float b) y=(pf(a)+pf(b)/2; h=(b-a)/2; for(i=1;in;i+) y=y+pf(a+i*h); y=y*h; return y;y2=jifen(f2, 2.0, 5.0); void main(void) float

57、 y; y=jifen(f1, 1.0, 3.0); coutyab; p=max(&a,&b); cout*p*y) pt=x; else pt=y; return pt;返回类型是指针返回类型是指针用指针类用指针类型接收型接收ab随机随机p&ax24&bypt&b&b输出:输出:4该指针所指向的空间是在主调该指针所指向的空间是在主调函数中开辟的。函数中开辟的。91char *strc(char *str1, char *str2) char *p; for(p=str1;*p!=0; p+); do *p+=*str2+; while (*s

58、tr2!=0); *p=0; return (str1); void main(void)char s180=“computer”, s2 =“language”, *pt; pt=strc(s1, s2); coutptendl;computerlanguagep指向指向str1的最后的最后str2向向p赋值赋值最后最后0结结束束92co m puter 0s1str1pco m puter 0s2str2pstr2co m puter 0p93已知函数已知函数int *f(int *),有以下说明语句:,有以下说明语句:int *p, *s, a;函数正确的调用形式是:函数正确的调用形式是

59、:A) a=*f(s) B) *p=f(s) C) s=f(*p) D) p=f(&a)94指针指针数组数组和和指向指针的指针指向指针的指针指针数组的概念指针数组的概念一个数组,其元素均为一个数组,其元素均为指针类型指针类型的数据,称为指针的数据,称为指针数组。也就是说,数组。也就是说,指针数组中的每一个元素都是指指针数组中的每一个元素都是指针变量,可以放地址针变量,可以放地址。类型标识类型标识 *数组名数组名数组长度说明数组长度说明int *p4; int (*p)4; pp3p2p1p0地址地址地址地址地址地址地址地址p为数组名,内有四个为数组名,内有四个元素,每个元素可以放元素,

60、每个元素可以放一个一个int型数据的地址型数据的地址 p为指向有四个为指向有四个int型元素的一维数组的行指针型元素的一维数组的行指针 95void main(void)float a=100,200,300,400,500;float *p=&a0,&a1,&a2,&a3,&a4;int i;for(i=0;i5;i+)cout*pit;coutendl;pp4p3p2p1p0&a4&a3&a2&a1&a0a4a3a2a1a0a500400300200100p数组元素数组元素内放地址内放地址*pi=*(*(p+i

61、) )p+0p+1p+2p+3p+496void main(void) int a12=1,2,3,.11,12; int *p4, i; for(i=0; i4;i+) pi=&ai*3; coutp32endl;p32=*(*(p+3)+2)=*(p3+2)12123456789101112app0p1p2p3&a0&a3&a6&a9p+0p+1p+2p+3*(p+3)p3+1p3+297常用字符指针数组,数组中的元素指向字符串首地址,这常用字符指针数组,数组中的元素指向字符串首地址,这样比字符数组节省空间。样比字符数组节省空间。char *str =“China”, “Japan”, “America”;3090H3000H2000Hstrstr2str1st

温馨提示

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

评论

0/150

提交评论