第10章第4节 §104字符串的指针和指向字符串的指针变量 字符串的表示形式 1.用字符数组 maino ichar string[ 14=I love China! 14个元素 printf( %s", string); ove n a )注意输入输出 输出: 输入: 用函数(1) puts(string); 键入 (1)gets(string); I love China! 用s格式 (2) printf%s”, string);(2) scant(“%s3”, string) love China!, 只能输入I (3)for(i=0;i<=13;i++)(3)for(i=0;i<=12;i++) 引用单 stringli]=getchar(; → I love China! 个元素 putchar(stringed) strng|++il=“0 (4)for(i=0;i<=13i++) 4)for(i=0:iK=12;i+ rinf("c", strin;,san“e,srig;→ I love china! scanf“%d”,& strint[13
第10章第4节 §10.4 字符串的指针和指向字符串的指针变量 一. 字符串的表示形式 1 . 用字符数组 main() {char string[14]=“I love China!” printf(“%s”,string); } 1) 注意输入输出 输出: I l o v e C h i n a ! ‘\0’ 14个元素 (1) puts(string); (2) printf(“%s”,string); (3) for(i=0;i<=13;i++) putchar(string[i]); (4) for(i=0;i<=13;i++) printf(“%c”,string[i]); 输入: (1) gets(string); (2) scanf(“%s”,string); (3) for(i=0;i<=12;i++) string[i]=getchar( ); strng[++i]=‘\0’; (4) for(i=0;i<=12;i++) scanf(“%c”,&string[i]); scanf(“%d”,&strint[13]; I love China! I love China! 键入 I love China! I love China! 0 只能输入I 用函数 用s格式 引用单 个元素
第10章第4节 2)字符数组的地址—与数组中地址的概念相似 字符数组名 string→首地址→& cstring|0 元素地址 tring+2 &string 2 元素值 * (string-+2) string 2 2.用字符指针 不定义字符数组,而用指向字符的指针主要用于表示字符串常量 main 0 tchar*string="I love China! 等价于 char *stringa printf((“%s”, string); string=“ Ilove china!” 字符串“ Ilove china!”在内存中仍采用“字符数组”的方式存放,故 string=“ Ilove china!” “ I love china!的首地址(元素的地址)、赋给 指针变量 string 问: 如: string= string+2 结果 printf((“%s”, string love china!
第10章第4节 2) 字符数组的地址——与数组中地址的概念相似 字符数组名 string 首地址 &string[0] 元素地址 string+2 &string[2] 元素值 *(string+2) string[2] 2 . 用字符指针 不定义字符数组,而用指向字符的指针 main() {char *string=“I love China!” printf(“%s”,string); } char *string; string=“I love China!” 字符串“I love China!”在内存中仍采用“字符数组”的方式存放,故: string=“I love China!” “I love China!”的首地址(元素I的地址) 指针变量string 问: 如:string=string+2; printf(“%s”,string); love China! 结果 赋给 等价于 主要用于表示字符串常量
第10章第4节 二.字符串中字符的引用 下标法 指针法(或地址法) 例将字符串a,复制到字符串b中去,不用 strcpy函数 法一:地址法# include“ 'stdio. h” maIn { char a=“ I love china!”,b20 for(i=0;(a+i)=0;i++) b+i)=*(a+i) t(a+)等价于a (b+i)=“0; (b+等价于bi puts(b); 3 法二:指针法 # include“ stdio.h” # include“ stdio. h” maino maIn { char a=“ Ilove china!"”,b|20],*p1,*p2 tchar *pl=l love china!, b[20], *p2; int i. int i. for(p1=a,p2=b;*pl!=“0;p1++,p2++) for(p2=b;*pl!=“0;p1++,p2++) p2=pl; p2=0, p2=0 puts(b); puts(b);
第10章第4节 二. 字符串中字符的引用 下标法 指针法(或地址法) 例 将字符串a, 复制到字符串b中去,不用strcpy函数 法一: 地址法 # include“stdio.h” main() {char a[]=“I love china!”,b[20]; int i; for(i=0; *(a+i)!=‘\0’;i++) *(b+i)=*(a+i); *(b+i)=‘\0’; puts(b);} 法二: 指针法 # include“stdio.h” main() {char a[]=“I love china!”,b[20], *p1,*p2; int i; for(p1=a,p2=b; *p1!=‘\0’;p1++,p2++) *p2=*p1; *p2=‘\0’; puts(b); } # include“stdio.h” main() {char *p1=“I love china!”,b[20],*p2; int i; for(p2=b; *p1!=‘\0’;p1++,p2++) *p2=*p1; *p2=‘\0’; puts(b); } *(a+i) a[i] *(b+i) b[i] 等价于 等价于
第10章第4节 三、用指向字符串的指针作函数参数 1.字符数组名 作函数的参数「与数值型的数组相似 2指向字符串的指针 (形参和实参) 例将字符串a,复制到字符串b中去,不用 strcpy函数 法一:用字符数组名作函数参数 viod fl(char all, char b for(i=0; a:=0; i++) bi=a; bi=“0’; main { char alli=“ Ilove china!”; char b]; fI(a, b); printf((“%s”,b); 法二:用字符指针作函数参数
三. 用指向字符串的指针作函数参数 1.字符数组名 2.指向字符串的指针 作函数的参数 (形参和实参) 例 将字符串a, 复制到字符串b中去,不用strcpy函数 法一:用字符数组名作函数参数 viod f1(char a[], char b[]) {int i; for(i=0;a[i]!=‘\0’; i++) b[i]=a[i]; b[i]=‘\0’; } main() {char a[]=“I love China!”; char b[20]; f1(a,b); printf(“%s”,b); } 法二:用字符指针作函数参数 第10章第4节 与数值型的数组相似
函数的多种写法 第10章第4节 viod fl(char *a, char*b) viod fI(char *a, char *b) fint i; for(i=0;(a+i)!=“0’;i++) for(;*a∴=“10;a++,b++) (b+i)=*(a+i); a, (b+i)=0’; b=“10; 主函数的多种写法 mainO main( { char all=“ ' It is a book”; { char al=“ 't is a book”; char b30 char b[30, pl, "p2; fl(a, b); pI=a; p2=b; printi(“%s”,b); f1(pl, p2); printi(“%s”,p2); maino {char*pl=“ 'It is a b0ok”; maino char b30, *p2; { char *pl=“ It is a book”; char p2=b; fI(pl, p2); n(pl,p2);。。o(有误! printf(%s”,p2); printi(“%s”,p2);
viod f1(char *a, char *b) {int i; for(i=0;*(a+i)!=‘\0’; i++) *(b+i)=*(a+i); *(b+i)=‘\0’; } 函数f1的多种写法 第10章第4节 viod f1(char *a, char *b) { for( ;*a!=‘\0’; a++,b++) *b=*a; *b=‘\0’; } 主函数的多种写法 main() { char a[]=“It is a book”; char b[30]; f1(a,b); printf(“%s”,b); } main() { char a[]=“It is a book”; char b[30],*p1,*p2; p1=a; p2=b; f1(p1,p2); printf(“%s”, p2); } main() { char *p1=“It is a book”; char b[30],*p2; p2=b; f1(p1,p2); printf(“%s”, p2); } main() { char *p1=“It is a book”; char *p2; f1(p1,p2); printf(“%s”, p2); } 有误!!
第10章第4节 小结 四种方式 与数组相似 形参 实参 字符数组名 字符数组名 字符数组名 字符指针 字符指针 字符数组名 字符指针 字符指针
第10章第4节 **小结** 四种方式 与数组相似 形参 实参 1 字符数组名 字符数组名 字符数组名 字符指针 字符数组名 字符指针 字符指针 字符指针 2 3 4
第10章第5节 §10.5函数的指针和指向函数的指针变量 函数指针的概念 函数经编译后,形成若干条可执 4800指令m 行的指令,顺序放入程序区,每一个 4101指令2 flO函数 函数第一条指今的存放地址,即函数 n0函数→4100指令1 的入口地址,叫做函数的指针。 入口地址 故调用函数,就是找到相应的函 程序区 3050指令n 数入口地址,并转入该地址,向后 执行指令。 main( 202指令3 对应 对应 函数名函数入口地址 2001指令2 m函数+2000指令1 入口地址 函数名、应 入口地址 C中规定函数名 入口地址 指向 数据区 450 定义一个指针变量 入口地址 称为 400 nt x 指向函数的指针变量
§10.5 函数的指针和指向函数的指针变量 第10章第5节 一. 函数指针的概念 int y int x main() f1()函数 400 450 2000 2002 2001 3050 4100 4101 4800 ...... 指令m ...... 指令2 指令1 ...... ...... 指令n ...... 指令3 指令2 指令1 ...... ...... ...... ....... main()函数 指令1 入口地址 f1()函数 入口地址 函数经编译后, 形成若干条可执 行的指令, 顺序放入程序区, 每一个 函数第一条指今的存放地址, 即函数 的入口地址, 叫做函数的指针 。 程 序 区 数 据 区 故调用函数,就是找到相应的函 数入口地址,并转入该地址,向后 执行指令。 函数名 函数 入口地址 对应 对应 函数名 入口地址 对应 C中规定 函数名 入口地址 表示 定义一个指针变量 入口地址 指向 称为 指向函数的指针变量
二.用函数指针变量调用函数 第10章第5节 1.指向函数的指针变量的定义 类型符(*指针变量名)() 空 2.使用 指函数返回值的类型 例求ab的最大值 用函数的一般调用方法 用函数指针的方法 int max(int x, int y) int max(int x, int y) d return(x>y?x y); 3 return(>y?x y); maino main( fint max(int, int ) fint max(int; int ) nt a bc nt a.b.c int(p)O;←-定义指向函数的指针变量 scanf( %d, %d,, &a, &b) Fmax 使p指向max的入口地址 c=max( a, b scanf%d,%d”,&a,&b) printf( max=%d, c) C=(p)(a,b)←-用函数指针调用函数 printf( max=%d”c); 1)定义指向函数的指针变量 用函数指针调 用函数方法12)使指针变量指向函数的入口地址 3)用(*p)替代函数名(*p(ab) max(a, b)
二. 用函数指针变量调用函数 第10章第5节 1. 指向函数的指针变量的定义 类型符 (*指针变量名) ( ) 空 指函数返回值的类型 例:求a,b 的最大值 int max(int x, int y) {return(x>y?x:y);} main() {int max(int ; int ); int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b) printf(“max=%d”,c); } main() {int max(int ,int ); int a,b,c; int (*p)(); p=max; scanf(“%d,%d”,&a,&b); c=(*p)(a,b) printf(“max=%d”,c); } 用函数指针的方法: 定义指向函数的指针变量 使p指向max的入口地址 用函数指针调用函数 用函数指针调 用函数方法 1)定义指向函数的指针变量 2)使指针变量指向函数的入口地址 3)用(*p) 替代 函数名 (*p)(a,b) max(a,b) int max(int x, int y) {return(x>y?x:y);} 用函数的一般调用方法: 2. 使用
三.用指向函数的指针变量作函数参数 第10章第5节 相当于用函数名作(其他)函数的参数 例10.24设一函数 process在调用它时,每次实现不同的功能。主函数中输入a、b两个数,第 次调用 process时求出a、b中最大值,第二次调用时求出a、b中最小值,第三次调用时求出a、b 之和。 Int max (int x. Int freturn(x>y? x y) Int min(int x, int y) freturn(x<y? x: y),) int add (int x, int y) freturn(x+y); int process( int x, int y, int (*p)(int, int ) 指向函数的指针作形参 fint resulte resulte=p(x,y) 可省 return(resulte);) 函数声明 main( fint max(int x, int y), min(int x, int y), add(int x, int y), process( int x,int y, int(*p)(int, int )) a, b printf( input a, b="); scanf(%d, %d, &a, &b) 可省 prit( max=%d, process( a, b, max);}函数名作实参 printf("max=%dn, process(a, b, min)) printf("max=%dn,process(a,b, add);
三 第10章第5节 . 用指向函数的指针变量作函数参数 相当于用函数名作(其他)函数的参数 例 10.24 设一函数process,在调用它时,每次实现不同的功能。主函数中输入a、b两个数,第一 次调用process时求出a、b中最大值,第二次调用时求出a、b中最小值,第三次调用时求出a、b 之和。 int max (int x, int y) {return(x>y? x:y);} int min (int x, int y) {return(x<y? x:y);} int add (int x, int y) {return(x+y);} int process( int x,int y , int (*p)(int,int )) {int resulte; resulte=(*p)(x,y); return(resulte); } main() {int max(int x,int y), min(int x, int y), add (int x, int y), process( int x,int y, int (*p)(int,int )); int a,b, printf(“input a,b=“); scanf(“%d,%d”,&a,&b); printf(“max=%d\n”,process (a,b,max)); printf(“max=%d\n”,process (a,b,min)); printf(“max=%d\n”,process (a,b,add)); } 函数名作实参 指向函数的指针作形参 可省 可省 函数声明
本题可变为: 第10章第5节 int max (int x, int y) Rreturn(x>y? x: y int min (int x, int y) freturn(x<y? x y), 3 int add (int x, int y) freturn(x+y) int process( int x,int y, int(*p)o) fint resulte resulte=(p)(x y) return(resulte):) maino fint max(intx, int y), min(int x, int y), add(int x, int y), process( int x, int y int(*p)O); int a b int(*1)0,(j0(k)0; printf("input a, b=); scanf(%d,%d”,&a1&b) -max; j=min; k=add printf(" max=%dn,, process(a, b, i)) printf("max=%dn, process(a, b,D); printf("max=%d\n",process(a, b, k)
main() {int max(intx,int y), min(int x, int y), add (int x, int y), process( int x,int y int (*p)()); int a,b int (*i)(), (*j)(), (*k)(); printf(“input a,b=“); scanf(“%d,%d”,&a,&b); i=max; j=min; k=add; printf(“max=%d\n”,process (a,b,i)); printf(“max=%d\n”,process (a,b,j)); printf(“max=%d\n”,process (a,b,k)); } 本题可变为: int max (int x, int y) {return(x>y? x:y);} int min (int x, int y) {return(x<y? x:y);} int add (int x, int y) {return(x+y);} int process( int x,int y , int (*p)( )) {int resulte; resulte=(*p)(x,y); return(resulte); } 第10章第5节