《C大学教程指针和基本指针的字符串课件》由会员分享,可在线阅读,更多相关《C大学教程指针和基本指针的字符串课件(70页珍藏版)》请在金锄头文库上搜索。
1、C+大学教程 2007.9第八章第八章 指针和基于指针的字符串指针和基于指针的字符串v指针指针v引用调用引用调用v数组与指针数组与指针v函数指针函数指针v基于指针的字符串基于指针的字符串v总结总结C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针:地址数据指针:地址数据v我们首先的观念就是简单地把地址作为数我们首先的观念就是简单地把地址作为数据,可以把地址存储在内存中。据,可以把地址存储在内存中。int x; 1000 1000 2 2x = 2; 1004 1004 1020 1020 10001000由于地址作为数据对待,他们由于地址作为数据对待,他们也可以存储在内存中。也
2、可以存储在内存中。C大学教程指针和基本指针的字符串课件C+大学教程 2007.9一个变量的指针一个变量的指针v当一个变量存储另一个变量的地址时,那我们说它当一个变量存储另一个变量的地址时,那我们说它就是那个变量的指针。就是那个变量的指针。v在内存表中,我们经常用箭头来表示指针,在内存表中,我们经常用箭头来表示指针,x x的真的真实地址和我们实地址和我们理解的概念不理解的概念不相关。相关。v我们经常用任意我们经常用任意 地址描述指针,地址描述指针, 同时在以后经常同时在以后经常会放弃它。会放弃它。 int x; 1000 2 x = 2; 1004 1020 1000 我们把1000作为整数2的
3、指针C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针的概念指针的概念v指针就是把地址作指针就是把地址作为数据,把地址存为数据,把地址存储在内存中储在内存中v指针变量指针变量:存储地:存储地址的变量址的变量v变量的指针变量的指针:当一:当一个变量存储另一个个变量存储另一个变量的地址时,那变量的地址时,那我们说它就是那个我们说它就是那个变量的指针变量的指针1000 21000如在某一程序如在某一程序中定义了中定义了int x;int x;X=2;X=2;如系统给如系统给x x分分配的空间是配的空间是10001000号单元,号单元,则指向则指向x x的指的指针是另一个变针是另一个变
4、量,该变量中量,该变量中存放的数据为存放的数据为10001000C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针变量的声明指针变量的声明v如何定义一个变量为指针变量?如何定义一个变量为指针变量? 类型标识符类型标识符 *指针变量指针变量; 如:如:int int *intp;intp; double double *doublep;doublep; char *chPtr; char *chPtr;多个指针变量需要分别加多个指针变量需要分别加* *: double *doublep,*doubleq; double *doublep,*doubleq;C大学教程指针和基本指针
5、的字符串课件C+大学教程 2007.9关于指针的几个问题关于指针的几个问题v回答这些问题可以使我们更好地理解指针回答这些问题可以使我们更好地理解指针。 int x,*px; x = 2; 1000 x 2 1004 问题:问题:1、如何把如何把x x的地址置入的地址置入pxpx中?中?2、如何用如何用pxpx处理和改变处理和改变x x? 1020 pxC大学教程指针和基本指针的字符串课件C+大学教程 2007.9问题问题1:指针赋值:指针赋值v我们不能用简单的常数作为地址对指针进行赋我们不能用简单的常数作为地址对指针进行赋值。我们永远不知道当我们编写程序时,变量值。我们永远不知道当我们编写程序
6、时,变量地址的值将是什么?地址的值将是什么? int x,*px; 1000 x = 2; 2 1004 问题:问题:1 1、如何把、如何把x x的地址置入的地址置入pxpx中?中?我们不能用这样表示:我们不能用这样表示: 1020 pxpxpx=1000; ; C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针赋值指针赋值v如何把某一变量的地址置入一个指针变如何把某一变量的地址置入一个指针变量中?量中?用地址运算符用地址运算符 “ “&” ” 解决。解决。如表达式如表达式 “&x” ” 返回的是变量返回的是变量 x 的地址。如:的地址。如:intp = &x; ;& 运算符后
7、面不能跟常量或表达式。如运算符后面不能跟常量或表达式。如 &2 是没有意义的,是没有意义的,&(m * n + p )。也是没有意。也是没有意义的义的C大学教程指针和基本指针的字符串课件C+大学教程 2007.9地址运算符地址运算符v提供运算符返回操作数的地址,我们用提供运算符返回操作数的地址,我们用& &来来表示。表示。 int x,*px; 1000 x = 2; 2 1004 我们想要做的:px = x的地址 1020我们应该表示为: px px = &xC大学教程指针和基本指针的字符串课件C+大学教程 2007.9处理内存地址处理内存地址v使用变量的指针就是为了用这个指针得到使用变量的
8、指针就是为了用这个指针得到变量的值并改变它。变量的值并改变它。int x,*px; 1000 2x = 2; 1004 px = &x;2、我们怎样用px得到x的值并改变它? 1020 px C大学教程指针和基本指针的字符串课件C+大学教程 2007.9问题问题2 2:处理内存地址:处理内存地址v如何用指针变量处理和改变它所指向的单元如何用指针变量处理和改变它所指向的单元的值?的值?用引用运算符用引用运算符 “ “*” ” 解决解决。如。如 *intp 表示的是表示的是 intp 指向的这个单元的内容。指向的这个单元的内容。在对在对 intp 使用引用运算之前,必须先对使用引用运算之前,必须先
9、对 intp 赋值赋值C大学教程指针和基本指针的字符串课件C+大学教程 2007.9引用运算符引用运算符v在定义中,在定义中,* *号是语法标记同时和类型结合在一起产生一号是语法标记同时和类型结合在一起产生一个指针定义。个指针定义。v在运算时,我们采用在运算时,我们采用* *号运算符,就象指针定义一样。号运算符,就象指针定义一样。 但是但是* *号是独立号是独立 运算符,并和运算符,并和 指针一起表示指针一起表示 一个数值。一个数值。int x,*px,y; 1000 x 2x = 2; 1004px = &x;y 2我们想得到:我们想得到:y=pxy=px指向的值指向的值; ; 1020 p
10、x我们表示为:我们表示为:y=*px;y=*px; C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针处理指针处理v我们可以认为一个指针是另一个变量的参考,当我们可以认为一个指针是另一个变量的参考,当我们处理这个变量时,我们叫这个运算符为我们处理这个变量时,我们叫这个运算符为“参参考运算符考运算符”,这个操作为,这个操作为“参考指针参考指针”int x,*px,y; 1000x 2x = 2; 1004 2px = &x;yy=*px; 1020 px*为引用运算符 C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针的基本类型指针的基本类型v为什么指针要指向一定
11、类型的数据?为什么指针要指向一定类型的数据? 地址对于编译器来说不足以解析地址的数据类型。地址对于编译器来说不足以解析地址的数据类型。v由于指针的基本数据类型可以对指针表达式进行错由于指针的基本数据类型可以对指针表达式进行错误检查,误检查,v比如,分配一比如,分配一个整型数据指个整型数据指针,或者反之针,或者反之将产生一个警将产生一个警告。告。 int x,*px,y; 1000x 2x = 2; 1004 px = &x;y 2y=*px; 1020指针必须要有一个明确的数据类型 px 1000以便编译器可以解析数据的指向类型C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针
12、实例指针实例如有:如有:int X, *intp, Y;X=3;Y=4;intp=&X;1000intp10044Y10003X如执行:如执行:*intp=Y+4;1000intp10044Y10008X注意:不能用注意:不能用intp=100;intp=100;因为我们永远不知道变量存储的真实地址,而且程序每因为我们永远不知道变量存储的真实地址,而且程序每次运行可能都不同。运行次运行可能都不同。运行Fig.8.4 Fig.8.4 观察观察aPtraPtr值的变化值的变化C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针的定义及使用指针的定义及使用v指针变量可以指向不同的变量。
13、如指针变量可以指向不同的变量。如上例中上例中intp指向指向x,我们可以通过对,我们可以通过对intp的重新赋值改变指针的指的重新赋值改变指针的指向。如果想让向。如果想让intp指向指向y,只要执行,只要执行intp=&y就可就可以了。这时,以了。这时,intp与与x无任何关系。无任何关系。v同类的指针变量之间可相互赋值,表示同类的指针变量之间可相互赋值,表示二个指针二个指针指向同一内存空间。指向同一内存空间。v空指针空指针指针没有指向任何空间指针没有指向任何空间空指针用常量空指针用常量NULLNULL表示,表示,NULLNULL的值一般赋为的值一般赋为0 0不能引用空指针指向的值不能引用空指
14、针指向的值C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针变量的使用练习指针变量的使用练习设有定义设有定义 int x, y; int *p1,*p2;1000x1004y1008p11012p2执行语句:执行语句:x=23;y=234;1000 23x1004 234y1008p11012p2执行语句:执行语句:p1=&x;p2=&y;1000 23x1004 234y1008 1000p11012 1004p2执行语句:执行语句:*p1=34;*p2=17;1000 34x1004 17y1008 1000p11012 1004p2C大学教程指针和基本指针的字符串课件C+
15、大学教程 2007.9指针实例指针实例有以下结构有以下结构 Ap1aBp2b比较执行比较执行 p1=p2和和 *p1= *p2后的不同结果。后的不同结果。 解:解: Ap1aBp2bBp1aBp2bC大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针的初始化指针的初始化v指针在使用前必须初始化。指针在使用前必须初始化。v仅和别的变量一样定义指针,不初始化是一个仅和别的变量一样定义指针,不初始化是一个比较普遍的错误。比较普遍的错误。v没有初始化的指针可能指向任意地址,对这些没有初始化的指针可能指向任意地址,对这些指针作操作可能会导致程序错误。指针作操作可能会导致程序错误。vNULL
16、NULL是一个特殊指针值,称为空指针。它的值是一个特殊指针值,称为空指针。它的值为为0 0。它可被用来初始化一个指针,表示不指。它可被用来初始化一个指针,表示不指向任何地址。向任何地址。C大学教程指针和基本指针的字符串课件C+大学教程 2007.9void指针指针vvoid指针:统配指针类型指针:统配指针类型v定义:定义:void *指针变量名;指针变量名;v作用:在标准作用:在标准C中,只有类型相同的指中,只有类型相同的指针之间能互相赋值,但任何类型的指针针之间能互相赋值,但任何类型的指针都能与统配指针互相赋值。主要用于动都能与统配指针互相赋值。主要用于动态内存分配。态内存分配。C大学教程指
17、针和基本指针的字符串课件C+大学教程 2007.9第八章第八章 指针和基于指针的字符串指针和基于指针的字符串v指针指针v引用调用引用调用v数组与指针数组与指针v函数指针函数指针v基于指针的字符串基于指针的字符串v总结总结C大学教程指针和基本指针的字符串课件C+大学教程 2007.9传参数到函数的方法传参数到函数的方法vC+有三种传递参数到函数的有三种传递参数到函数的方法方法: 按值传递按值传递, 用引用参数按引用传递用引用参数按引用传递 用指针参数按引用传递用指针参数按引用传递v按值传递按值传递: 在函数内部对形式在函数内部对形式参数的任何改变都不会影响实参数的任何改变都不会影响实际参数的值。
18、际参数的值。void swap(int a, int b) int c; c=a; a=b; b=c; 如果调用如果调用swap(x, y);并不能真正交换并不能真正交换x和和y的值!的值!C大学教程指针和基本指针的字符串课件C+大学教程 2007.9引用调用引用调用v但在某些应用中确实需要改变实际参数但在某些应用中确实需要改变实际参数的值。例如,我们经常需要修改两个变的值。例如,我们经常需要修改两个变量的值,希望有个函数可以实现此功能。量的值,希望有个函数可以实现此功能。要解决此问题可以采用指针作为参数。要解决此问题可以采用指针作为参数。C大学教程指针和基本指针的字符串课件C+大学教程 20
19、07.9引用调用引用调用-指针作为函数参指针作为函数参数数void swap(int *a, int *b) int c; c=*a; *a= *b; *b=c; swap(&x, &y) 3 4xyab用指针作为参数可以在函数中修改主调程序的用指针作为参数可以在函数中修改主调程序的变量值,即实现变量传递。但必须小心使用!变量值,即实现变量传递。但必须小心使用!调用:调用:C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针作为函数参数指针作为函数参数void swap(int *a, int *b) int c, d; c=*a; *a= *b; *b=c; a=&c; b=&
20、d swap(&x, &y) 3 4xyabcd这里这里, 通过传指针仍然交换了通过传指针仍然交换了x, y的值的值,交换后交换后a, b又分别获得了局部变量又分别获得了局部变量c, d的地址的地址. 所以函所以函数本质上还是传值数本质上还是传值, 是将地址值传给了是将地址值传给了a, b变量变量.调用:调用:C大学教程指针和基本指针的字符串课件C+大学教程 2007.9引用传递步骤引用传递步骤v把函数参数声明为指针把函数参数声明为指针v在函数体内使用间接访问指针在函数体内使用间接访问指针v当调用函数时,把地址作为参数传递当调用函数时,把地址作为参数传递C大学教程指针和基本指针的字符串课件C+
21、大学教程 2007.9能解一元二次方程的函数能解一元二次方程的函数v目前为止我们了解到的函数只能有一个返回值,目前为止我们了解到的函数只能有一个返回值,由由return 语句返回。语句返回。v一个一元二次方程有二个解,如何让此函数返一个一元二次方程有二个解,如何让此函数返回二个解。答案是采用指针作为函数的参数。回二个解。答案是采用指针作为函数的参数。v函数原型可设计为:函数原型可设计为: int SolveQuadratic(double a, double b, double c, double *px1, double *px2)v函数的调用函数的调用 SolveQuadratic(1.3
22、, 4.5, 2.1, &x1, &x2) SolveQuadratic(a, b, c, &x1, &x2)C大学教程指针和基本指针的字符串课件C+大学教程 2007.9完整的函数完整的函数int SolveQuadratic(double a,double b,double c,int SolveQuadratic(double a,double b,double c, double *px1,double *px2double *px1,double *px2) ) double disc, sqrtDisc; double disc, sqrtDisc; if(a = 0) retur
23、n 1; if(a = 0) return 1; disc = b * b 4 * a * c; disc = b * b 4 * a * c; if(disc0) return 1; if(disc0) return 1; sqrtDisc = sqrt(disc); sqrtDisc = sqrt(disc); *px1*px1 = (-b + sqrtDisc) / (2 * a); = (-b + sqrtDisc) / (2 * a); *px2*px2 = (-b - sqrtDisc) / (2 * a); = (-b - sqrtDisc) / (2 * a); return
24、0; return 0; C大学教程指针和基本指针的字符串课件C+大学教程 2007.9SolveQuadraticSolveQuadratic的调用的调用int main(void) double a, b, c, x1, x2; int result; cout“input a, b, c:n”; cinabc; result = SolveQuadratic(a, b, c, &x1, &x2); if (result) cout“error”; else cout“x1=“x1x2=“x2;C大学教程指针和基本指针的字符串课件C+大学教程 2007.9const修饰指针修饰指针v指针是
25、如此的奇妙指针是如此的奇妙, 通过传递指针值通过传递指针值, 函函数获得了对外界变量空间的访问权限数获得了对外界变量空间的访问权限, 尤其为其创造了修改空间中数据的机会尤其为其创造了修改空间中数据的机会.v如何通过指针只能做读取如何通过指针只能做读取, 而不能写入而不能写入?用用const修饰修饰v加加const的时机的时机: 遵循最小特权原则遵循最小特权原则, 对对于函数的参数于函数的参数, 在能满足函数处理数据在能满足函数处理数据的要求的前提下的要求的前提下, 给予它最小的权限给予它最小的权限C大学教程指针和基本指针的字符串课件C+大学教程 2007.9const修饰参数的四种方式(修饰参
26、数的四种方式(1)v指向非常量的非常量指针指向非常量的非常量指针 调用调用: int x; f(&x) void f(int *ptr) 可以通过引用改变可以通过引用改变x的值的值; /*ptr=3; 可以改变可以改变ptr本身的值本身的值; / ptr+; ; 此时此时, x是变量是变量, ptr也是变量也是变量C大学教程指针和基本指针的字符串课件C+大学教程 2007.9v指向常量数据的非常量指针指向常量数据的非常量指针 调用调用: int x; f(&x) void f(const int *ptr) 不可以通过引用改变不可以通过引用改变x的值的值; /*ptr=3; 可以改变可以改变p
27、tr本身的值本身的值; / ptr+; ; 此时此时, x是变量是变量, ptr也是变量也是变量, 但不可以通过对但不可以通过对ptr的引用运算而修改的引用运算而修改x的值的值const修饰参数的四种方式(修饰参数的四种方式(2)C大学教程指针和基本指针的字符串课件C+大学教程 2007.9v指向非常量的常量指针指向非常量的常量指针 调用调用: int x; f(&x) void f( int * const ptr ) 可以通过引用改变可以通过引用改变x的值的值; /*ptr=3; 不可以改变不可以改变ptr本身的值本身的值; / ptr+; ; 此时此时, ptr是常量是常量, x的值也不
28、可以通过的值也不可以通过ptr的的引用方式来改动引用方式来改动 const修饰参数的四种方式(修饰参数的四种方式(3)C大学教程指针和基本指针的字符串课件C+大学教程 2007.9v指向常量的常量指针指向常量的常量指针 调用调用: int x; f(&x) void f( const int * const ptr ) 不可以通过引用改变不可以通过引用改变x的值的值; /*ptr=3; 不可以改变不可以改变ptr本身的值本身的值; / ptr+; ; 此时此时, ptr是变量是变量, ptr所指的空间中的值也不所指的空间中的值也不能通过它来改变能通过它来改变const修饰参数的四种方式(修饰参
29、数的四种方式(4)C大学教程指针和基本指针的字符串课件C+大学教程 2007.9sizeofsizeof(sizeof(类型名类型名) ) 返回该数据类型单个元素所占的字节数返回该数据类型单个元素所占的字节数sizeof sizeof 数组名数组名 返回该数组所占的字节数返回该数组所占的字节数int array10;coutsizeof arrayendl; void f(int *p, int len) coutsizeof pendl;调用调用f(array, 10); 返回返回10*4 即即 40输出输出4, 即一个指针变量占据的空间即一个指针变量占据的空间, 而非数组而非数组array
30、占据的空间占据的空间C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针小结指针小结int x,y,*p;定义一个整型指针。如定义多个指针变量,定义一个整型指针。如定义多个指针变量,则在每个变量前都要加则在每个变量前都要加*p = &x;把变量的地址赋给指针把变量的地址赋给指针*p = 2;改变指针指向的地址的值改变指针指向的地址的值y = *p;指针指向的地址中的值赋给一个变量指针指向的地址中的值赋给一个变量Swap(&x,&y);传递地址参数传递地址参数void Swap(int *p1, int *p2)定义指针作为形式参数定义指针作为形式参数C大学教程指针和基本指针的字符
31、串课件C+大学教程 2007.9第八章第八章 指针和基于指针的字符串指针和基于指针的字符串v指针指针v引用调用引用调用v数组与指针数组与指针v函数指针函数指针v基于指针的字符串基于指针的字符串v总结总结C大学教程指针和基本指针的字符串课件C+大学教程 2007.9数组与指针数组与指针v在在C+中中, 数组与指针是密切相关的数组与指针是密切相关的, 两者几两者几乎可以交换使用乎可以交换使用. 数组名代表数组的起始地址数组名代表数组的起始地址,因此一个数组名就是一个常量指针因此一个数组名就是一个常量指针.v数组与指针相同之处数组与指针相同之处 在访问内存方面的操作方式几乎相同在访问内存方面的操作方
32、式几乎相同v数组与指针不同之处数组与指针不同之处 1、系统内存空间分配不同、系统内存空间分配不同 2、数组名是常量指针,不能修改它的值。、数组名是常量指针,不能修改它的值。C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针的运算指针的运算const int N =5;int aN=1,2,3,4,5; 假设假设300是是a的基的基地址地址int *p; 12345ap+i 本质是本质是 p+4*i3、 *(a+2) ?2、+p; 1、p=a; p=300p=300+4*13C大学教程指针和基本指针的字符串课件C+大学教程 2007.9数组与指针数组与指针相同之处相同之处cons
33、t int N =5;int aN, *p; 假设假设300是是a的基地址的基地址如下操作是允许的:如下操作是允许的:p=&a0; 此时此时p=300等价于等价于 p=&a1; 此时此时p=304;p=a; p=a+1; C大学教程指针和基本指针的字符串课件C+大学教程 2007.9数组与指针数组与指针相同之处相同之处const int N =5;int aN, *p; 假设假设300是是a的基地址的基地址对数组求和的三种方式:对数组求和的三种方式:方法方法1: sum=0; for( p = a; p &aN; +p ) sum += p;方法方法2: sum=0; for( i = 0;
34、i N; +i ) sum += *(a+i);方法方法3: p=a; sum=0; for( i = 0; i N; +i ) sum += pi;C大学教程指针和基本指针的字符串课件C+大学教程 2007.9数组与指针数组与指针不同之处不同之处v系统内存空间分配不同系统内存空间分配不同const int N =5;int aN, *p; 假设假设300是是a的基地址的基地址300304308312316a0a1a2a3a4apC大学教程指针和基本指针的字符串课件C+大学教程 2007.9const int N =5; int aN, *p; 假设假设300是是a的基地址的基地址以下操作是以
35、下操作是不不允许的:允许的: a=p; a+; a+=3;a是常量指针,不能修改它的值。是常量指针,不能修改它的值。运行并分析运行并分析Fig. 8.20, Fig.8.21数组与指针数组与指针不同之处不同之处C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针数组指针数组数组是同种数据类型数据的集合数组是同种数据类型数据的集合,该类型当然也该类型当然也可以是指针可以是指针.指针数组指针数组: 数组的每个元素都是指针数组的每个元素都是指针如如: char *a4; char ch1, ch2, ch3, ch4 a0=&ch1; a1=&ch2; a2=&che3; a3=&ch
36、4;C大学教程指针和基本指针的字符串课件C+大学教程 2007.9指针数组指针数组 实际应用中实际应用中,常见的做法是字符串数组常见的做法是字符串数组: const char *suit4=“Hearts”, “Diamonds”, “Clubs”, “Spades” 字符串数组中的每一项都是一个字符串字符串数组中的每一项都是一个字符串,实际实际指向相应字符串的第一个字符的指针指向相应字符串的第一个字符的指针(地址地址) C大学教程指针和基本指针的字符串课件C+大学教程 2007.9第八章第八章 指针和基于指针的字符串指针和基于指针的字符串v指针指针v引用调用引用调用v数组与指针数组与指针v函
37、数指针函数指针v基于指针的字符串基于指针的字符串v总结总结C大学教程指针和基本指针的字符串课件C+大学教程 2007.9函数指针函数指针指向函数的指针指向函数的指针: 指针指向内存中函数代码存放的起始地址指针指向内存中函数代码存放的起始地址函数指针和其它指针一样也可以传递给函数、从函函数指针和其它指针一样也可以传递给函数、从函数中返回、赋给其他的函数指针、存储在数组中。数中返回、赋给其他的函数指针、存储在数组中。函数指针的声明函数指针的声明: 如如 bool (*compare)(int, int) 类型名类型名(*指针变量名指针变量名)(形式参数列表形式参数列表)C大学教程指针和基本指针的字
38、符串课件C+大学教程 2007.9函数指针函数指针通过函数指针调用函数通过函数指针调用函数: 如如 (*compare)(3+5, x) 其中其中x是是int类型类型 (*指针变量名指针变量名)(实际参数列表实际参数列表)函数指针常用在菜单驱动的系统中函数指针常用在菜单驱动的系统中, 将不同的菜单将不同的菜单功能设计成不同的函数来实现功能设计成不同的函数来实现, 之后根据用户输之后根据用户输入的不同通过函数指针调用不同的函数入的不同通过函数指针调用不同的函数.C大学教程指针和基本指针的字符串课件C+大学教程 2007.9例例: Fig08.29/ Fig. 8.29: fig08_29.cpp
39、/ Demonstrating an array of pointers to functions.#include using std:cout;using std:cin;using std:endl;/ function prototypes - each function performs similar actionsvoid function0( int );void function1( int );void function2( int );C大学教程指针和基本指针的字符串课件C+大学教程 2007.9例例: Fig08.29int main() void (*f 3 )( i
40、nt ) = function0, function1, function2 ; int choice; cout choice;声明函数指针数组C大学教程指针和基本指针的字符串课件C+大学教程 2007.9例例: Fig08.29 while ( ( choice = 0 ) & ( choice 3 ) ) (*f choice )( choice ); cout choice; cout Program execution completed. endl; return 0;通过函数指针调用不同函数C大学教程指针和基本指针的字符串课件C+大学教程 2007.9例例: Fig08.29vo
41、id function0( int a ) cout You entered a so function0 was callednn; void function1( int b ) cout You entered b so function1 was callednn; void function2( int c ) cout You entered c word;v通过通过cin调用函数调用函数getline读入一个字符串到一个字符读入一个字符串到一个字符数组中。读入时见到数组中。读入时见到一个换行符号一个换行符号结束,结束,结果串中结果串中不含换行符。不含换行符。 char line8
42、0; cin.getline(line, 80);C大学教程指针和基本指针的字符串课件C+大学教程 2007.9字符串处理库中的字符串操作函数字符串处理库中的字符串操作函数v#include v提供了字符串操作、比较、查找、计算长度等函数提供了字符串操作、比较、查找、计算长度等函数char *strcpy(char *s1, const char *s2)把把s2复制到复制到s1,直到遇到直到遇到s2中的中的0。s1要保证足够空间。函数要保证足够空间。函数返回返回s1的值的值char *strncpy(char *s1, const char *s2, size_t n)把把s2复制到复制到s
43、1,且最多复制且最多复制n个字符。个字符。s1要保证足够空间。函数返回的是要保证足够空间。函数返回的是s1的值的值char *strcat(char *s1, contst char *s2) 把把s1与与s2拼接起来,结果存放到拼接起来,结果存放到s1中。程序员必须保证中。程序员必须保证s1有足够的空有足够的空间容纳拼接结果。函数返回的是串间容纳拼接结果。函数返回的是串s1。C大学教程指针和基本指针的字符串课件C+大学教程 2007.9int strcmp(const char *s1, const char *s2)按照字典次序比较按照字典次序比较s1和和s2,s1s2 结果结果 s2 0
44、char *strcpy(char *s1, const char *s2)把把s2复制到复制到s1,直到遇到直到遇到s2中的中的0。s1要保证足够空间。函要保证足够空间。函数返回的是数返回的是s1size_t strlen(const char *s)函数返回函数返回0前的字符个数前的字符个数字符串处理库中的字符串操作函数字符串处理库中的字符串操作函数C大学教程指针和基本指针的字符串课件C+大学教程 2007.9Fig 08-32#include using std:cout;using std:endl;#include / prototypes for strcat and strnca
45、tusing std:strcat; using std:strncat; int main()C大学教程指针和基本指针的字符串课件C+大学教程 2007.9 char s1 20 = Happy ; / length 6 char s2 = New Year ; / length 9 char s3 40 = ; cout s1 = s1 ns2 = s2; strcat( s1, s2 ); / concatenate s2 to s1 (length 15) cout nnAfter strcat(s1, s2):ns1 = s1 ns2 = s2; / concatenate firs
46、t 6 characters of s1 to s3 strncat( s3, s1, 6 ); / places 0 after last characterC大学教程指针和基本指针的字符串课件C+大学教程 2007.9 cout nnAfter strncat(s3, s1, 6):ns1 = s1 ns3 = s3; strcat( s3, s1 ); / concatenate s1 to s3 cout nnAfter strcat(s3, s1):ns1 = s1 ns3 = s3 endl; return 0; C大学教程指针和基本指针的字符串课件C+大学教程 2007.9Fig
47、08-34strtok把字符分解为一个个记号#include using std:cout;using std:endl;#include / prototype for strtokusing std:strtok; int main()C大学教程指针和基本指针的字符串课件C+大学教程 2007.9 char sentence = This is a sentence with 7 tokens; char *tokenPtr; cout The string to be tokenized is:n sentence nnThe tokens are:nn; / begin tokeniz
48、ation of sentence tokenPtr = strtok( sentence, );C大学教程指针和基本指针的字符串课件C+大学教程 2007.9 / continue tokenizing sentence until tokenPtr becomes NULL while ( tokenPtr != NULL ) cout tokenPtr n; tokenPtr = strtok( NULL, ); / get next token / end while cout nAfter strtok, sentence = sentence endl; return 0;C大学教
49、程指针和基本指针的字符串课件C+大学教程 2007.9常见错误常见错误v忘记给串尾加上忘记给串尾加上0;v程序员有责任确保为串分配足够空间;程序员有责任确保为串分配足够空间; char s3; strcpy(s,”abc“);va 与与 ”a”用错位置用错位置vchar w100; scanf(“%s”,&w)C大学教程指针和基本指针的字符串课件C+大学教程 2007.9第八章第八章 指针和基于指针的字符串指针和基于指针的字符串v指针指针v引用调用引用调用v数组与指针数组与指针v函数指针函数指针v基于指针的字符串基于指针的字符串v总结总结C大学教程指针和基本指针的字符串课件C+大学教程 200
50、7.9总结总结指针指针v指针指针 是一个包含了地址值的变量;是一个包含了地址值的变量; 指针的声明方式:如指针的声明方式:如 int *ptr, ptr称作整型指针称作整型指针 指针的初始化:可以为指针的初始化:可以为0, NULL 或一个变量的地址或一个变量的地址v指针运算:指针运算: 地址运算符地址运算符&将一个变量的地址赋给一个指针,不能将将一个变量的地址赋给一个指针,不能将&用于用于一个常量一个常量 引用运算符引用运算符*返回存储在指针所指的内存中保存的数据返回存储在指针所指的内存中保存的数据v作为函数参数作为函数参数 当调用函数时当调用函数时, 如果所用参数需要在函数中修改其值如果所
51、用参数需要在函数中修改其值, 则该则该参数以指针的方式传入参数以指针的方式传入, 在函数中以引用运算修改其值在函数中以引用运算修改其值 const修饰指针参数可以防止在函数内通过引用方式修改所修饰指针参数可以防止在函数内通过引用方式修改所指空间的值指空间的值C大学教程指针和基本指针的字符串课件C+大学教程 2007.9总结总结数组与指针数组与指针v数组名实际就是数组的起始地址数组名实际就是数组的起始地址,即第一个元素的地即第一个元素的地址址, 可以将其付给同类型的指针变量可以将其付给同类型的指针变量v指针指向一个数组时可以象数组名一样带下标来用指针指向一个数组时可以象数组名一样带下标来用vsi
52、zeof(数组名数组名)返回数组的总字节数返回数组的总字节数v指针可进行算数运算指针可进行算数运算,特别注意指针特别注意指针+1意味着指针值意味着指针值加指向对象的字节数加指向对象的字节数vvoid指针可以存放任何类型的指针值指针可以存放任何类型的指针值. 其他类型指其他类型指针值可以直接赋值给它针值可以直接赋值给它, 但要注意但要注意: 一个一个void指针值指针值赋值给其他类型的指针必须经过强制的转换赋值给其他类型的指针必须经过强制的转换C大学教程指针和基本指针的字符串课件C+大学教程 2007.9总结总结v数组中也可以存放指针类型数组中也可以存放指针类型v函数指针是函数在内存中的存放地址
53、函数指针是函数在内存中的存放地址v函数指针可以象其他指针一样传递给函数函数指针可以象其他指针一样传递给函数, 从函数从函数返回返回, 存储赋值存储赋值v函数指针常用于菜单驱动系统函数指针常用于菜单驱动系统, 由用户选择菜单中由用户选择菜单中的具体项来决定运行的函数的具体项来决定运行的函数v字符串名代表了存储字符串数组的起始地址字符串名代表了存储字符串数组的起始地址, 本质本质上是一个指针值上是一个指针值v字符串处理库提供了一系列函数字符串处理库提供了一系列函数strcpy、strncpy、strcat、strncat、strcmp、strncmp、strtol、strlen C大学教程指针和基本指针的字符串课件