C语言程序设计教程课件:6_a_pointer_1

上传人:人*** 文档编号:570019924 上传时间:2024-08-01 格式:PPT 页数:58 大小:2.89MB
返回 下载 相关 举报
C语言程序设计教程课件:6_a_pointer_1_第1页
第1页 / 共58页
C语言程序设计教程课件:6_a_pointer_1_第2页
第2页 / 共58页
C语言程序设计教程课件:6_a_pointer_1_第3页
第3页 / 共58页
C语言程序设计教程课件:6_a_pointer_1_第4页
第4页 / 共58页
C语言程序设计教程课件:6_a_pointer_1_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《C语言程序设计教程课件:6_a_pointer_1》由会员分享,可在线阅读,更多相关《C语言程序设计教程课件:6_a_pointer_1(58页珍藏版)》请在金锄头文库上搜索。

1、程序设计基础(程序设计基础(C C语言)语言)POINTER POINTER 指针指针链表链表listlist队列队列queuequeue二叉树二叉树binary-treebinary-treeWhy we need POINTERS Why we need POINTERS ?共 114 页 第 3 3 页Chapter 9 Pointer (Chapter 9 Pointer (指针指针) ) 指针的基本概念指针的基本概念 指针与函数的关系指针与函数的关系 指针的基本运算指针的基本运算 指针与数组的关系指针与数组的关系 指针及其应用指针及其应用Contents共 114 页 第 4 4 页

2、9-1 Concept of Pointer9-1 Concept of Pointerl变量的变量的4个个属性属性 变量名称变量名称:进行编程,按名引用:进行编程,按名引用 变量数据类型变量数据类型:决定占用多少存储单元:决定占用多少存储单元 变量的值变量的值:程序运行时进行运算:程序运行时进行运算 变量地址变量地址:程序运行时,要将变量的值保:程序运行时,要将变量的值保存在计算机的存储单元中,每个存储单元都存在计算机的存储单元中,每个存储单元都有唯一的内存地址。变量在内存中占据的存有唯一的内存地址。变量在内存中占据的存储单元的地址就是变量的地址。储单元的地址就是变量的地址。知识点回顾:变量

3、知识点回顾:变量9-1 Concept of Pointer9-1 Concept of Pointer知识点回顾:变量的地址知识点回顾:变量的地址 定义变量定义变量: : int k; / int k; /系统根据系统根据intint为为k k分配内存单元分配内存单元。 输入变量的值输入变量的值: : scanf(scanf(“%d%d”,&k);,&k);/&k&k代表了变量代表了变量k k在内存中的地址在内存中的地址。以往对变量的访问是通过以往对变量的访问是通过变量名变量名, ,这种操作称为这种操作称为直直接访问接访问: : int k; int k; scanf( scanf(“%d%

4、d”,&k); ,&k); printf(printf(“%dn%dn”,k);,k); C C 提供了另一种方式提供了另一种方式: :将变量将变量k k的地址存放在另的地址存放在另一个变量处一个变量处( (假定为假定为pk)pk),通过通过访问访问pkpk,就可以间接,就可以间接地访问变量地访问变量k k,这种方式,这种方式称为称为间接访问间接访问。共 114 页 第 6 6 页9-1 Concept of Pointer9-1 Concept of Pointerl概念概念指针:内存中的某个指针:内存中的某个地址地址一般变量:存储变量的一般变量:存储变量的值值指针变量指针变量:保存:保存地

5、址的变量地址的变量n直接访问直接访问:通过变量名访问该变量通过变量名访问该变量n间接访问间接访问:通过指针变量中存放的地址通过指针变量中存放的地址 访问该变量访问该变量 指针与指针变量指针与指针变量保存其它变量地址的变保存其它变量地址的变量称为指针变量。量称为指针变量。可以认为:指针变量是可以认为:指针变量是用于指向其它变量的变量。用于指向其它变量的变量。指针变量的值是指针指针变量的值是指针即指针变量中存放的值即指针变量中存放的值-地址地址9-1 Concept of Pointer9-1 Concept of PointerNOTES5 5 1000100010001000100210021

6、004100420102010i i i ij j j jk k k kp p p ppointerpointerpointerpointer共 114 页 第 8 8 页9-1 Concept of Pointer data type9-1 Concept of Pointer data typelDeclaration of pointer variables数据类型数据类型 * * 变量名变量名;指针变量的声明指针变量的声明数数据据类类型型说说明明符符所所定定义义的的类类型型,并并非非指指针针变变量量自自身身的的类类型型,而而是是指指针针变变量量所所指指对对象象的的类类型型;“*”号号表

7、表示示它它后后面面的的变变量量名名为为指指针针类类型型,称为称为指针变量指针变量;指针可以指向任何类型的对象,包括指针可以指向任何类型的对象,包括指针指针;共 114 页 第 9 9 页9-1 Concept of Pointer data type9-1 Concept of Pointer data type指针变量的声明指针变量的声明1 定义时标识符前面的定义时标识符前面的“*”表示该变量为指针变量表示该变量为指针变量。 如果有语句:如果有语句: int *pp,*pi; 指针变量名为指针变量名为 pp、pi 而不是而不是*pp、*pi。2. 一一个个指指针针变变量量只只能能指指向向同同

8、一一个个类类型型的的变变量量,上上例例中中pp和和pi都都是指向整型变量的指针变量,而不能去指向其它类型的变量。是指向整型变量的指针变量,而不能去指向其它类型的变量。应注意的两点应注意的两点:NOTES10指针变量的使用指针变量的使用l&:取地址运算符:取地址运算符 &a 表示取表示取a的地址;的地址; 若若p=&a,则指针变量,则指针变量p中存放中存放a 的地址,称的地址,称p指向指向a;l*:指针内容运算符:指针内容运算符 *p表示取指针表示取指针p所指内存单元所指内存单元的内容;的内容;9-1 Concept of Pointer operator9-1 Concept of Point

9、er operator指针变量的使用指针变量的使用1. 取地址运算符取地址运算符“&”是取操作对象的地址,而不是值。是取操作对象的地址,而不是值。2. 上例中的第一句与第三句中的上例中的第一句与第三句中的 “ *p”含义不同。含义不同。 第一句中的第一句中的“ *p”表示将变量表示将变量 p 说明为指针变量,用说明为指针变量,用“*”区别于一般变量。第三句中的区别于一般变量。第三句中的“ *p”是使用指针变量是使用指针变量 p 所所指向的变量的值。此时指向的变量的值。此时“*”是运算符,表示取指针所是运算符,表示取指针所指向的内容。指向的内容。即对即对 p 进行进行间接存取运算。间接存取运算。

10、 int x=10,y,*p; p=&x; /* 表示取表示取 x 的地址,将变量的地址,将变量 x 地址赋给指针变量地址赋给指针变量p */ y=*p; /* *p表示取指针变量表示取指针变量p所指单元的内容,即变量所指单元的内容,即变量 x 的值,的值,y=10 */定义指针变量定义指针变量内容运算,取指针指向的变量的值内容运算,取指针指向的变量的值9-1 Concept of Pointer operator9-1 Concept of Pointer operatorExampleNOTES共 114 页 第 1212 页9-1 Concept of Pointer - operato

11、r9-1 Concept of Pointer - operator 知识点回顾知识点回顾l运算符运算符(单目单目 )& 取变量的地址取变量的地址 14* * 取指针变量(所指向)的内容取指针变量(所指向)的内容 14l注意注意: 运算符运算符 & 和和“位与位与”运算是同一符号;运算是同一符号; 运算符运算符 * * 和和“乘乘”运算是同一符号。运算是同一符号。 只能从程序的上下文来区分运算符只能从程序的上下文来区分运算符 & 和和运运算符算符 * * 的实际意义。的实际意义。共 114 页 第 1313 页9-1 Concept of Pointer9-1 Concept of Point

12、erchar c=A; 若变量若变量c在内存中对应的地址为在内存中对应的地址为1000; 变量变量名称名称:c,类型为类型为char,占用占用1个个字节字节 变量变量c的的值值: 字母字母A 变量变量c的的地址地址:1000若有:若有:char * * pc;则称指针变量则称指针变量pc是是char型指针型指针pc = &c; /* /* & &取地址取地址 */ */则称指针变量则称指针变量pc指向变量指向变量c1000A变量变量c1001.20001000变量变量pc2001Example14l使用赋值语句赋初值:使用赋值语句赋初值: int a,*pa; pa = &a;l在说明指针变量

13、的时进行初始化:在说明指针变量的时进行初始化: int a, *pa = &a; int a,*pa; *pa = &a;9-1 Concept of Pointer9-1 Concept of Pointer 指针变量的赋值指针变量的赋值共 114 页 第 1515 页9-1 Concept of Pointer9-1 Concept of Pointer已知:已知:int x=2, y, * *px; x为一般变量,为一般变量,px为指针型变量为指针型变量px px = &x; 取变量取变量x的地址赋值给指针的地址赋值给指针px 又称为又称为让让px指向变量指向变量x x=10;x210

14、* *px = 10; 也称为也称为间接访问间接访问Example共 114 页 第 1616 页9-1 Concept of Pointer9-1 Concept of Pointer y=x * * 100; * *px=y* *10; +x; x+; px若若px已经已经指向指向x,则可以用则可以用 * *px 代替变量代替变量 xx210 y = * *px; 取指针取指针px的内容的内容 y = * *px * * 100; x = y * * 10; + * * px (* * px)+; 括号不能省略括号不能省略 y=x; Example179-1 Concept of Poin

15、ter9-1 Concept of Pointerint main(void)int main(void) int a,b; int a,b; scanf(“%d %d”,&a,&b); scanf(“%d %d”,&a,&b); printf(“a = %d b = %dn”,a,b); printf(“a = %d b = %dn”,a,b); int main(void)int main(void) int a,b,*pa,*pb; int a,b,*pa,*pb; pa = &a; pb = &b; pa = &a; pb = &b; scanf( scanf(“%d %d%d %d”

16、,pa,pb);,pa,pb); printf( printf(“a = %d b = %dna = %d b = %dn”,*pa,*pb);,*pa,*pb); l 9-1 Concept of Pointer9-1 Concept of Pointer19main()main() intint a=10, a=10,*p1*p1,*p2,*p3=NULL;,*p2,*p3=NULL; void *pvoid *p; ; p1=p1=00; ; p2=&a; p2=&a; 9-1 Concept of Pointer - 9-1 Concept of Pointer - 空指针和空指针和v

17、oidvoid指针指针空指针空指针: :无指向对象的指针,应赋无指向对象的指针,应赋NULL(ASCIINULL(ASCII 为为0)0)值。值。voidvoid型指针型指针: :无指定类型的指针。无指定类型的指针。指针指针p无指定类型无指定类型p1无指向变量无指向变量Example20问题:指针变量能指向常数吗?问题:指针变量能指向常数吗?讨论!讨论!常数不占用程序中动态分配的内存单元常数不占用程序中动态分配的内存单元9-1 Concept of 9-1 Concept of PointerPointer指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指

18、向与其类型不同的变量的变量!我是真的,我是真的,你猜对了你猜对了!应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值Which one is correct?9-1 Concept of 9-1 Concept of PointerPointer共 114 页 第 2222 页l 指针是一类特殊的数据类型。指针变量存储数据的指针是一类特殊的数据类型。指针变量存储数据的地址,可以指向地址,可以指向所有类型所有类型的数据的数据9-1 Concept of Pointer9-1 Concept of Pointer brief summary brief summary 指针指向指针指向变

19、量变量-变量的指针变量的指针( (存变量的地址存变量的地址) ) 指针指向指针指向数组数组-数组指针数组指针( (存数组的起始地址存数组的起始地址) ) 指针指向指针指向函数函数-函数型指针函数型指针( (存放函数的入口地址存放函数的入口地址) ) 指针指向指针指向指针指针-指针型指针指针型指针( (存放某指针的地址存放某指针的地址) ) 指针指向指针指向结构结构 指针指向指针指向文件文件 指针是定位其他对象的特殊类型的数据指针是定位其他对象的特殊类型的数据(存放其他对象的地址)(存放其他对象的地址)由指针组成的数组由指针组成的数组-指针数组指针数组 共 114 页 第 2323 页l指针与函

20、数的关系指针与函数的关系参参数数为为指指针针:通通过过参参数数在在函函数数之之间间传传递递变变量量地址,即要在函数之间传递指向变量的地址,即要在函数之间传递指向变量的指针指针。返回值为指针返回值为指针:函数的:函数的返回值返回值可以为可以为指针指针。指指向向函函数数的的指指针针: : 称称为为函函数数指指针针。形形参参为为指指向向函函数数中中的的指指针针,实实参参为为函函数数名名,即即函函数数在在内存中的可执行内存中的可执行代码的首地址代码的首地址。9-2 Pointer and Function9-2 Pointer and Function共 114 页 第 2424 页9-2 Point

21、er and Function9-2 Pointer and Function(1 1)指针作为函数参数)指针作为函数参数l在函数之间传递变量的地址在函数之间传递变量的地址函数用函数用一般的变量做参数一般的变量做参数可以可以传递变量的值传递变量的值要在函数间要在函数间传递变量地址传递变量地址必须用必须用指针变量做参数指针变量做参数即要在函数之间即要在函数之间传递指向变量的指针传递指向变量的指针。在函数间传递变量地址时,在函数间传递变量地址时,变量的地址变量的地址在调用函在调用函数时要作为数时要作为实际参数实际参数,被调用函数使用被调用函数使用指针变量指针变量作为作为形式参数形式参数接收传递的地

22、址。接收传递的地址。注意:实参注意:实参的的数据类型数据类型要与作为要与作为形参形参的的指针所指的对指针所指的对象的数据类型象的数据类型一致。一致。共 114 页 第 2525 页9-2 Pointer and Function9-2 Pointer and Functionl 用函数交换两个变量的值。用函数交换两个变量的值。 # #include include void swap ( int void swap ( int *px*px, int , int *py*py) /* ) /* 指向整型的指向整型的指针指针 */ */ int temp; /* int temp; /* 说明函

23、数内部使用的临时变量说明函数内部使用的临时变量 */ */ temp = temp = * *px; /* px; /* 将指针变量将指针变量pxpx的的内容内容赋给变量赋给变量temp */temp */ * *px = px = * *py; /* py; /* 将指针将指针pypy的的内容内容赋给指针赋给指针pxpx的的内容内容 */ */ * *py = temp; /* py = temp; /* 将变量将变量temptemp的的值值赋给指针赋给指针pypy的的内容内容 */ */ printf (in swap x=%d, y=%dn, *px, *py);printf (in s

24、wap x=%d, y=%dn, *px, *py); main ( )main ( ) int a, b; int a, b; a = 5; b = 10; a = 5; b = 10; printf (before swap a=%d, b=%dn, a, b); printf (before swap a=%d, b=%dn, a, b); swap( swap( &a&a, , &b&b ); /* ); /* 实参为变量实参为变量a a和和b b的的地址地址 */ */ printf (after swap a=%d, b=%dn, a, b);printf (after swap

25、a=%d, b=%dn, a, b); Example共 114 页 第 2626 页9-2 Pointer and Function9-2 Pointer and Functionmain main 函数函数 a = 5;a = 5; b = 10; b = 10; swap( &a, &b); swap( &a, &b); swap ( *px, *py ) swap ( *px, *py ) 函数函数 temp= *px; temp= *px; 语句语句 * *px = *py; px = *py; 语句语句 * *py = temp; py = temp; 语句语句 swap函数的执行

26、过程和各个变量的变化过程函数的执行过程和各个变量的变化过程510变量变量 a变量变量 b&a&b形参变量形参变量 px形参变量形参变量 py&a&b 变量变量 temp调用调用swap函数函数调用调用swap函数函数调用调用swap函数函数执行执行swap函数函数执行执行swap函数函数执行执行swap函数函数 temp = * *px * *px = * *py * *py = temp1055共 114 页 第 2727 页l参数单向传递参数单向传递void Swap(int x, int y) int temp; temp = x; x = y; y = temp;void Swap(i

27、nt *x, int *y) int temp; temp = *x; *x = *y; *y = temp;9-2 Pointer and Function9-2 Pointer and Function9-2 Pointer and Function9-2 Pointer and Functionswap函数的几种错误形式函数的几种错误形式(1/3(1/3)/*x,y为局部变量为局部变量*/l参数单向传递参数单向传递void Swap(int *p1, int *p2) int *p; p = p1; p1 = p2; p2 = p; void Swap(int *x, int *y) i

28、nt temp; temp = *x; *x = *y; *y = temp;9-2 Pointer and Function9-2 Pointer and Function9-2 Pointer and Function9-2 Pointer and Functionswap函数的几种错误形式函数的几种错误形式(2/3(2/3)/*p1,p2为局部变量为局部变量*/l指针指针p没有有效地址没有有效地址void Swap(int *p1, int *p2) int *p; /*指针指针p未初始化未初始化*/ *p = *p1; *p1 = *p2; *p2 = *p; void Swap(in

29、t *x, int *y) int temp; temp = *x; *x = *y; *y = temp;9-2 Pointer and Function9-2 Pointer and Function9-2 Pointer and Function9-2 Pointer and Functionswap函数的几种错误形式函数的几种错误形式(3/3(3/3)共 114 页 第 3131 页9-2 Pointer and Function9-2 Pointer and Functionl :使用函数使用函数plusplus求两个数的和。求两个数的和。 # #include include ma

30、in ( )main ( ) int a, b, c; int a, b, c; printf (Enter A and B ); printf (Enter A and B ); scanf (%d%d, &a, &b); scanf (%d%d, &a, &b); c = plus( &a, &b ); /* c = plus( &a, &b ); /* 实参为变量实参为变量a a和和b b的地址的地址 */ */ printf (A+B=%d, c);printf (A+B=%d, c); int plus (int *px, int *py ) int plus (int *px, i

31、nt *py ) /*/*形参为指向整型的指针形参为指向整型的指针*/*/ return ( *px + *py ); return ( *px + *py ); /* /* 返回两个整数的和返回两个整数的和 */ */ Example共 114 页 第 3232 页9-2 Pointer and Function9-2 Pointer and Functionl :使用函数使用函数plusplus求两个数的和。求两个数的和。 # #include include main ( ) main ( ) int a, b, c; int a, b, c; printf (Enter A and B

32、 ); printf (Enter A and B ); scanf (%d%d, &a, &b); scanf (%d%d, &a, &b); plus( a, b, &c ); plus( a, b, &c ); /实参为变量实参为变量c c的地址的地址 printf (A+B=%d, c);printf (A+B=%d, c); plus (int x, int y , int * z) plus (int x, int y , int * z) /形参形参z z为指向整型的指针为指向整型的指针 * *z = x + y ;z = x + y ; Example 使用函数求两个变量的最大

33、值。使用函数求两个变量的最大值。# include main( ) int a, b, *pmax ; int *max( int *, int * ) ; printf ( “Enter a, b:” ) ; scanf ( “%d%d”, &a,&b) ; pmax=max(&a,&b); printf ( “max=%dn”,*pmax ) ; int *max ( a, b ) int *a,*b; int *p; p=*a*b? a: b; return ( p ); 返回最大值的地址返回最大值的地址(2)(2) 指针作为函数返回值指针作为函数返回值9-2 Pointer and F

34、unction9-2 Pointer and FunctionExample共 114 页 第 3434 页35charchar min(char a10) min(char a10) char i,m;char i,m; m=a0; m=a0; for(i=1;i10;i+) for(i=1;i10;i+) if(aim) m=ai; if(aim) m=ai; return return m m; ; 返回返回charchar值值charchar * *min(char a10) min(char a10) char i,*pm;char i,*pm; pm=&a0; pm=&a0; fo

35、r(i=1;i10;i+) for(i=1;i10;i+) if(ai*pm) pm=&ai; if(ai*pm) pm=&ai; return return pmpm; ; 返回返回char *(charchar *(char指针指针) )值值(2)(2) 指针作为函数返回值指针作为函数返回值9-2 Pointer and Function9-2 Pointer and Function#include “stdio.h”char *ff(char *p)while(*p!=0) if(*p=i) return p; else p+; return NULL;main( )/*将将a串中串中

36、 i 改成改成 I */char a =“i am boy.i get ”; char *p1=a,*p2; while(*p1!=0) p2=ff(p1); /*返回字符指针返回字符指针*/ if(p2!=NULL)*p2=I; p1=p2+1; else break; printf(“a=%sn”,a);未找到未找到返回返回 i 的地址的地址下一个查下一个查找地址找地址(2)(2) 指针作为函数返回值指针作为函数返回值9-2 Pointer and Function9-2 Pointer and Functionl(3 3)指向函数的指针)指向函数的指针共 114 页 第 3737 页9-

37、2 Pointer and Function9-2 Pointer and Function代码段代码段(二进制代码二进制代码,代码段内容为只读,代码段内容为只读,可以被多个进程共享,一个子进程和他的父可以被多个进程共享,一个子进程和他的父进程是共享这个代码段的)进程是共享这个代码段的) 数据段数据段(存储(存储:程序中被初始化的变量,其中程序中被初始化的变量,其中包括包括全局变量和初始化的静态变量全局变量和初始化的静态变量) 未初始化数据段未初始化数据段(如题,就是存储(如题,就是存储没有初始没有初始化的静态变量化的静态变量,俗称,俗称bss段)段) 堆堆heap(存储(存储:程序运行中程序

38、运行中动态分配的变量动态分配的变量) 栈栈stack(存储(存储:函数调用时保存函数调用时保存函数的返回函数的返回值、参数和函数内部的一些局部变量)值、参数和函数内部的一些局部变量) 命令行参数和环境变量命令行参数和环境变量 知识点补充(知识点补充(知识点补充(知识点补充(* *)#include static int a; /* A不包含在任何函数当中,不包含在任何函数当中,A是外部静态类变量是外部静态类变量*/ /*储存在数据段中的未初始化部分储存在数据段中的未初始化部分 */int main(void) int b = 614; /* b属于在属于在main函数内部的局部变量函数内部的局

39、部变量*/*局部变量属于动态类变量,所以储存在局部变量属于动态类变量,所以储存在“栈栈”中。中。 */ /*而而614是赋值的常量,是赋值的常量,614本身储存在数据段中本身储存在数据段中*/ int *c; /* c也是函数内部的局部指针变量,储存在也是函数内部的局部指针变量,储存在“栈栈”中中 */ c = (int *)malloc(520); /*malloc函数是分配动态内存空间函数是分配动态内存空间*/*由程序员动态分配的空间都将在由程序员动态分配的空间都将在“堆堆”上上*/ /*因此因此520这个申请出来的空间储存在这个申请出来的空间储存在“堆堆”中中 */l(3 3)指向函数的

40、指针)指向函数的指针9-2 Pointer and Function9-2 Pointer and Function 知识点补充(知识点补充(知识点补充(知识点补充(* *)共 114 页 第 3939 页9-2 Pointer and Function9-2 Pointer and Functionl(3 3)指向函数的指针)指向函数的指针:即函数在内存中代码的首地址即函数在内存中代码的首地址定义函数指针定义函数指针类型标识符类型标识符 ( * ( * 指针变量名指针变量名)( );)( );n注意:一定要有注意:一定要有2对小括号对小括号nint (*pf)( );/*指针定义:定义一个指

41、向函数的指针,该函指针定义:定义一个指向函数的指针,该函数的返回值为整型数的返回值为整型*/nint *pf( ); /*函数声明:声明一个返回值为指针的函数,函数声明:声明一个返回值为指针的函数,该指针指向一个整型数据该指针指向一个整型数据*/给函数指针变量赋值给函数指针变量赋值函数指针变量函数指针变量 = = 函数名;函数名;通过指针变量调用函数通过指针变量调用函数(* (* 函数指针变量函数指针变量)()(实际参数实际参数) )例:例: float fun( ) ;float (*f) ( ) ;f = fun ;共 114 页 第 4040 页9-2 Pointer and Funct

42、ion9-2 Pointer and Functionl 用指针调用函数实现从两个数中输出较大者。用指针调用函数实现从两个数中输出较大者。#include #include main( )main( ) int int maxmax( int, int ); ( int, int ); /* /* 函数声明函数声明 * */ / int ( int ( * pf * pf )( ); )( ); /* /* 函数指针定义函数指针定义 * */ / int a, b, c; int a, b, c; pf = maxpf = max; ; /* /* 将函数的入口地址赋给指针将函数的入口地址赋给

43、指针 * */ / scanf(%d,%d, &a, &b); scanf(%d,%d, &a, &b); c = (c = (*pf*pf)(a,b); )(a,b); /* /* 用指针调用函数用指针调用函数 * */ / printf(a=%d, b=%d, max=%d, a, b, c); printf(a=%d, b=%d, max=%d, a, b, c); int max( int x, int y )int max( int x, int y ) return ( xy ) ? x : y; return ( xy ) ? x : y; c = ( * pf ) (a,b);

44、 等价于等价于 c = max(a, b);Example41void print();main()int a=10,b=5,c=7; print(a,b,max);print(a,b,min);print(a,b,plus);int max(int x,int y)return xy?x:y;int min(int x,int y)return xy?x:y;int plus(int x,int y)return x+y;void print(int x,int y,int (*p)( )printf(“%dn”,(*p)(x,y);max(x,y)函函数数入入口口地地址址min(x,y)p

45、lus(x,y)9-2 Pointer and Function9-2 Pointer and FunctionExamplel以函数指针为函数调用的参数以函数指针为函数调用的参数429-2 Pointer and Function9-2 Pointer and FunctionnSuppose we want to carry out a computation with a variety of functionsnWhere f could be f(k)=sin(k), or f(k)=1/kExample439-2 Pointer and Function9-2 Pointer an

46、d Functiondouble sum_square( double (*f)(double x),int m, int n ) int i; double sum = 0.0; for(i=m;i、=、=、!=、=的关系运算。的关系运算。例例如如:当当指指针针 和和指指针针 指指向向同同一一数数组组中中的的元素时,则:元素时,则:n关关系系表表达达式式“pq”:当当p所所指指的的元元素素在在所所指指的的元元素素之之前前时时,表表达达式式成成立立;反反之之,表表达达式式不成立。不成立。n关关系系表表达达式式“p=q”:判判断断指指针针p和和q是是指指向向同同一一存存储储单单元元。当当指指向向

47、同同一一元元素素时时,表表达达式式成成立;反之,表达式不成立。立;反之,表达式不成立。9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers- - - -指针关系运算指针关系运算指针关系运算指针关系运算共 114 页 第 5151 页l基本运算辨析基本运算辨析int x=10, y=5, *p=&x, *q=&y;int x=10, y=5, *p=&x, *q=&y;9-3 Basic Ope

48、rations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers- - - -指针关系运算指针关系运算指针关系运算指针关系运算px2 10qy2 5p = q;p = q;为指针为指针p p赋值,使赋值,使p p和指针和指针q q指向同一单元指向同一单元qy2 5p*p = *q;*p = *q; 为指针为指针p p的内容赋值,使的内容赋值,使* *p p和和* *q q的值相同的值相同qy2 5px2 10 5共 114 页 第

49、 5252 页l基本运算辨析基本运算辨析int x=10, y=5, *p=&x, *q=&y;int x=10, y=5, *p=&x, *q=&y;9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers- - - -指针关系运算指针关系运算指针关系运算指针关系运算l空指针空指针 NULLNULLNULL 是是具具有有特特殊殊的的含含义义:表表示示指指针针没没有有指指向向任任何对象何对象任任

50、何何 指指 针针 p与与 NULL进进 行行 “P=NULL”或或“P!=NULL”运运算算均均有有意意义义:判判断断指指针针 p 是是否否指指向空。向空。p p = q q判断判断 指针指针p p 和指针和指针q q 是否指向同一单元是否指向同一单元*p *p = *q *q判断判断 指针指针p p 和指针和指针q q 的内容是否相同的内容是否相同共 114 页 第 5353 页l :编写函数,实现串反向。编写函数,实现串反向。 revstr ( char * s ) /* revstr ( char * s ) /* 将串将串s s反向反向 */ */ char *p=s, c;char

51、*p=s, c; while ( *p ) while ( *p ) p+; /* p+; /* 找到串结束标记找到串结束标记0 */0 */ p p-; /* ; /* 指针指针p p指向串中的最后一个字符指向串中的最后一个字符 */ */ while ( sp ) /* while ( sp ) /* 当串前面的指针当串前面的指针ss串后面的指针串后面的指针p p时时 */ */ c = *s; /* c = *s; /* 交换两个指针所指向的字符交换两个指针所指向的字符 */ */ * *s+ = *p; /* s+ = *p; /* 指针指针s s向后向后(+1)(+1)移动移动,先赋

52、值再,先赋值再+1 */+1 */ * *p p- = c; /* = c; /* 指针指针p p向前向前(-1)(-1)移动移动,先赋值再,先赋值再-1 */-1 */ 9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers- - - -指针关系运算指针关系运算指针关系运算指针关系运算Example共 114 页 第 5454 页lc)c)两个指针之间的减法运算两个指针之间的减法运算当当两两个

53、个指指针针指指向向同同一一数数组组中中的的元元素素时时,p-q p-q 的的物物理理意意义义是是:指指针针p 和和q 所所指指对对象象之之间间的的元素的数量元素的数量。当当两两个个指指针针分分别别指指向向不不同同数数组组的的元元素素时时,无意义无意义。9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers- - - -指针减法运算指针减法运算指针减法运算指针减法运算共 114 页 第 5555

54、页l :编写函数,求字符串的长度。编写函数,求字符串的长度。 strlen ( char * s ) strlen ( char * s ) /* /* 求串求串s s的长度的长度 */ */ char *p = s;char *p = s;while ( *p ) while ( *p ) p+; /* p+; /* 找到串结束标记找到串结束标记0 */0 */return ( p - s ); return ( p - s ); /* /* 两个指针相减法,求出串长两个指针相减法,求出串长 */ */ 9-3 Basic Operations on Pointers9-3 Basic Op

55、erations on Pointers9-3 Basic Operations on Pointers9-3 Basic Operations on Pointers- - - -指针减法运算指针减法运算指针减法运算指针减法运算a b c d e f 0sp =s+6串长串长=6Example共 114 页 第 5656 页l :编写递归函数,求字符串的长度。编写递归函数,求字符串的长度。ModelingModeling: 若当前字符为若当前字符为00,的串长为,的串长为0 0; 将串分为两部分:第一个字符和其它部分将串分为两部分:第一个字符和其它部分a a b c d e f g h 0

56、b c d e f g h 0 串长串长 = 1 + = 1 + 其余部分的长度其余部分的长度lCodingCoding strlen ( char * s ) /* strlen ( char * s ) /* 将串将串s s的长度的长度 */ */ if ( *sif ( *s = 0 ) return (0);0 ) return (0); else else return (1+strlen( s+1 );return (1+strlen( s+1 ); 9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers

57、9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers - - - -应用例题应用例题应用例题应用例题Example共 114 页 第 5757 页9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers - - - -应用例题应用例题应用例题应用例题l : 用递归的方法完成串反向。用递归的方法完成串反向。Model

58、ing:1.1.1.1.将给定的字符串分为两个部分:将给定的字符串分为两个部分:将给定的字符串分为两个部分:将给定的字符串分为两个部分:l l第一部分:第一个字符和最后一个字符第一部分:第一个字符和最后一个字符第一部分:第一个字符和最后一个字符第一部分:第一个字符和最后一个字符(0(0(0(0前的字符前的字符前的字符前的字符) ) ) )l l第二部分:从第二个字符到倒数第二个第二部分:从第二个字符到倒数第二个第二部分:从第二个字符到倒数第二个第二部分:从第二个字符到倒数第二个( ( ( (即中间的字符即中间的字符即中间的字符即中间的字符) ) ) ) 其中第二部分与原问题性质一样,只是缩小了

59、规模。其中第二部分与原问题性质一样,只是缩小了规模。其中第二部分与原问题性质一样,只是缩小了规模。其中第二部分与原问题性质一样,只是缩小了规模。 2. 2. 2. 2.基本算法基本算法基本算法基本算法l l交换第一部分交换第一部分交换第一部分交换第一部分的两个字符;的两个字符;的两个字符;的两个字符;l l将将将将第二部分构成一个字符串,递归第二部分构成一个字符串,递归第二部分构成一个字符串,递归第二部分构成一个字符串,递归:完成第二部分串反向。:完成第二部分串反向。:完成第二部分串反向。:完成第二部分串反向。Coding:首先定义两个字符指针分别指向字符串的首字符和除首先定义两个字符指针分别

60、指向字符串的首字符和除0以外的最后一个字符以外的最后一个字符将所指的将所指的两个字符进行交换两个字符进行交换使中间部分构成使中间部分构成“新的新的”字符串,并对其进行串反向操作。字符串,并对其进行串反向操作。Example共 114 页 第 5858 页0f e d c b0al程序程序 revstr ( char * s revstr ( char * s ) ) char *p = s, c; char *p = s, c; whilewhile ( *p ) ( *p ) p+;p+; p-; p-; /* /* */*/ if if ( s ( s p ) p ) c = *s;c =

61、 *s; *s = *p; *s = *p; /* */* */ *p = *p = 00; ; /* */* */ revstr(s+1);revstr(s+1); *p = c; *p = c; /* /* */ */ 9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers 9-3 Basic Operations on Pointers - - - -应用例题应用例题应用例题应用例题ca b c d e f 0spa b c d e f 0spff b c d e0spaacacspacs1p1f0满足满足 sp递归递归

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号