c语言 第9章_指针及其应用-计科[1]_第1页
c语言 第9章_指针及其应用-计科[1]_第2页
c语言 第9章_指针及其应用-计科[1]_第3页
c语言 第9章_指针及其应用-计科[1]_第4页
c语言 第9章_指针及其应用-计科[1]_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

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

文档简介

1、2022-4-301第第9章章指针及其应用指针及其应用2022-4-302主要内容主要内容2022-4-303为什么引入指针的概念为什么引入指针的概念2022-4-304内存内存和地址和地址2022-4-305寻址方式寻址方式 0 内存用户数据区内存用户数据区 2000 3 变量变量 i 2004 6 变量变量 j 2008 9 变量变量 k 3010 2000 变量变量 i_pointer 2022-4-306关于指针的原则关于指针的原则2022-4-307指针的概念指针的概念 a:(3000) b:(4000)8字节字节4字节字节2022-4-308指针变量指针变量 p(4000) c(2

2、000)75 2000*p2022-4-309指针变量的声明指针变量的声明例如例如: int i; int *p1; float f1; float *p2; 2022-4-3010指针变量的赋值指针变量的赋值赋给指针变量,不是赋给目标变量赋给指针变量,不是赋给目标变量例例: int i; int *p=&i;变量必须变量必须已说明过已说明过类型类型应一致应一致例例: int *p=&i; int i;( )2022-4-3011例例: int i; int *p=&i; int *q=p;用已初始化指针变量作初值用已初始化指针变量作初值例例: int *p; p=10

3、00; ()指针变量的赋值指针变量的赋值2022-4-3012例例: void main( ) int i=10; int *p; *p=i; printf(%d,*p); 危险!危险!例例: void main( ) int i=10,k; int *p; p=&k; *p=i; printf(%d,*p); 指针变量必须指针变量必须先赋值,再使用先赋值,再使用.200020042008整型变量整型变量i 指针变量指针变量p10随机随机20122022-4-3013int i;float *p;p=&i;一个指针变量不能指向一个指针变量不能指向与其类型不同的变量与其类型不同的

4、变量!int *p;float *q;p=q;应在类型相同的指应在类型相同的指针变量之间赋值针变量之间赋值int *p;p=100;指针变量只存放地址指针变量只存放地址!我是真的,我是真的,你猜对了吗?你猜对了吗?2022-4-3014取内容运算取内容运算*操作符操作符例如:例如: char c,*p=&c; *p=a; 这里这里*p 等同于变量等同于变量c 例如:例如: float f, *pf=&f; *pf =5.6f; *pf = *pf +4.4f;*pf表示表示变量变量f2022-4-3015含义含义:取变量的地址取变量的地址单目运算符单目运算符优先级优先级: 2结

5、合性结合性:自右向左自右向左含义含义:取指针所指向变量的内容取指针所指向变量的内容单目运算符单目运算符优先级优先级: 2结合性结合性:自右向左自右向左&与与*操作符操作符2022-4-3016.200020082012整型变量整型变量i变量变量i_pointer20042000指针变量指针变量10i_pointer &i &(*i_pointer)i *i_pointer *(&i)=i_pointer -指针变量,它的内容是地址量指针变量,它的内容是地址量*i_pointer-指针的指针的目标变量目标变量,它的内容是数据,它的内容是数据&i_point

6、er-指针变量占用内存的地址指针变量占用内存的地址200010i_pointer*i_pointer&i_pointeri指针变量指针变量变量变量变量地址变量地址(指针指针)变量值变量值地址存入地址存入指针变量指针变量指向指向2022-4-3017.200020082012整型变量整型变量i变量变量i_pointer20042000指针变量指针变量10例例 i=3;-直接访问直接访问3例例 *i_pointer=20; -间接访问间接访问20直接访问与间接访问直接访问与间接访问2022-4-3018p指向地址为指向地址为0的单元的单元,系统保证该单元不作它用系统保证该单元不作它用表示指

7、针变量值表示指针变量值没有意义没有意义#define NULL 0int *p=NULL: 例例 int *p; . while(p!=NULL) . 零指针(空指针)零指针(空指针)2022-4-3019例例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;表示不指定表示不指定p是指向哪一种是指向哪一种类型数据的指针变类型数据的指针变量量空类型指针空类型指针2022-4-3020例例:指针的概念指针的概念int main() int a,*pa=&a; a=10; printf(a:%dn,a); printf(*pa:%dn,*pa

8、); printf(&a:%x(hex)n,&a); printf(pa:%x(hex)n,pa); printf(&pa:%x(hex)n,&pa); return 0;.f86f8af8e整型变量整型变量a 指针变量指针变量pa10f86运行结果:运行结果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f8a(hex)2022-4-3021例例:输入两个数,并使其从大到小输出输入两个数,并使其从大到小输出int main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b)

9、; p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2); return 0;.2000201620042008201220242020指针变量指针变量p1 指针变量指针变量p 指针变量指针变量p2 整型变量整型变量b 整型变量整型变量a59输入输入5,9(回车)(回车)a=5,b=9max=9,min=5201220162012201620122022-4-3022指针与其它类型变量的对比指针与其它类型变量的对比2022-4-3023指针与函

10、数指针与函数2022-4-3024按值传递按值传递2022-4-3025.2000201620042008201220242020例例:交换两个数交换两个数形参形参和和实参实参都为都为一般变量一般变量#include void swap(int x,int y) int t; t=x; x=y; y=t;int main() int a=7,b=11; printf(a=%d,b=%dn,a,b); printf(swapped:n); swap(a,b); printf(a=%d,tb=%dn,a,b); return 0;a x bt y7117117117调用前调用前调用中调用中调用结束

11、调用结束值传递值传递int a=7,b=11;int *pointer_1=&a,*pointer_2=&b;swap(*pointer_1,*pointer_2);2022-4-3026按地址传递按地址传递2022-4-3027.2000201620042008201220242020void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;int main() int a=7,b=11; printf(a=%d,b=%dn,a,b); printf(swapped:n); swap(&a,&b); pr

12、intf(a=%d,b=%dn,a,b); return 0;例例:交换两个数交换两个数形参形参为为指针变量指针变量a p1 bp p2711200020047117调用前调用前调用中调用中调用结束调用结束地址传递地址传递 int *p; p=p1; p1=p2; p2=p;2022-4-3028.2000201620042008201220242020void swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p;int main() int a=7,b=11; int *pointer_1=&a,*pointer_2=&b; pr

13、intf(a=%d,b=%dn,a,b); printf(swapped:n); swap(pointer_1,pointer_2); printf(a=%d,b=%dn, *pointer_1,*pointer_2); return 0;a pointer_1 bp1 pointer_27112000200420042000调用前调用前调用中调用中调用结束调用结束p2p200020042000例例:交换两个数交换两个数形参形参和和实参实参都为都为指针变量指针变量2022-4-3029void swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *p

14、2=*p;int main() int a=7,b=11; int *pointer_1=&a,*pointer_2=&b; printf(a=%d,b=%dn,a,b); printf(swapped:n); swap(pointer_1,pointer_2); printf(a=%d,b=%dn, *pointer_1,*pointer_2); return 0;例例:交换两个数交换两个数形参形参和和实参实参都为都为指针变量指针变量int x,*p=&x;指针变量在使用前指针变量在使用前必须赋值!必须赋值!2022-4-3030日期转换问题日期转换问题 2022-4

15、-3031计算某年某月某日是这一年的第几天计算某年某月某日是这一年的第几天2022-4-3032计算某年的第几天是该年的第几月第几日计算某年的第几天是该年的第几月第几日2022-4-3033例:例:int array10; int *p=&array1; array0array1array2array3array9.p指针与数组指针与数组2022-4-3034指针运算指针运算-算术运算算术运算2022-4-3035+(*p)*(+p)*(p+)(*p)+让让p指向的指向的对象对象+1先让先让p指向下一个单元指向下一个单元,再取,再取p指向的对象指向的对象先取先取p指向的对象,再让指向的

16、对象,再让p指向下一单元指向下一单元先取先取p指向的对象,再让指向的对象,再让对象对象+1指针运算指针运算-算术运算算术运算n例如例如: int a=1,b=3,*p; p=&a; +(*p); *(+p); p22022-4-3036指针运算指针运算-关系运算关系运算2022-4-3037指针运算指针运算-赋值运算赋值运算void main() int a,*p=&a; scanf(%d,p);2022-4-3038指针与数组指针与数组6000600160026003600460056006600760086009a0a1a2aa+1a+2pp+1p+2数组名数组名是表示数组

17、是表示数组首地首地址的址的地址常量地址常量2022-4-3039a0a1a2a3a9.aa+9a+1a+2地址地址元素元素下标法下标法a0a1a2a9 变址运算符变址运算符ai *(a+i)*a*(a+1)*(a+2)*(a+9)a0a1a2a3a9.pp+9p+1p+2地址地址指针法指针法元素元素*p*(p+1)*(p+2)*(p+9)p0p1p2p9ai pi *(p+i) *(a+i)数组元素表示方法数组元素表示方法2022-4-3040输入输出数组的全部元素输入输出数组的全部元素方法方法1:下标法下标法 void main() int a10; int i; for (i=0; i10

18、; i+) scanf(%d, &ai); for (i=0; i10; i+) printf(%d , ai);方法方法2:指针法指针法 void main() int a10; int *p,i; for (p=a; p(a+10); p+) scanf(%d, p); for (p=a; p(a+10); p+) printf(%d , *p);2022-4-3041例:用多种方法访问一维数组各元素例:用多种方法访问一维数组各元素void main() int a5,*pa,i; for(i=0;i5;i+) ai=i+1; pa=a; for(i=0;i5;i+)printf(

19、*(pa+%d):%dn,i,*(pa+i); for(i=0;i5;i+) printf(*(a+%d):%dn,i,*(a+i); for(i=0;i5;i+)printf(pa%d:%dn,i,pai); for(i=0;i5;i+)printf(a%d:%dn,i,ai);a0a1a2a3a412345pa2022-4-3042例例:int a=1,2,3,4,5,6,7,8,9,10,*p=a,i; 数组元素地址数组元素地址的正确表示:的正确表示: (A)&(a+1)(B)a+(C)&p(D)&pi 数组名是数组名是地址常量,地址常量,下列写法是否正确下列写法

20、是否正确p+,p-a+,a-a+1,*(a+2)( )( )( )2022-4-3043例例:注意指针变量的运算注意指针变量的运算int main() int a=5,8,7,6,2,7,3; int y,*p=&a1; y=(*-p)+; printf(%d ,y); printf(%d,a0); return 0; ap输出:输出:5 662022-4-3044例:注意指针的当前值例:注意指针的当前值int main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+,p+) print

21、f(%d ,*p); return 0;ap指针变量可以指到指针变量可以指到数组后数组后的内存单元的内存单元p=a;58762732022-4-3045数组名作函数参数数组名作函数参数实参实参形参形参数组名数组名指针变量指针变量数组名数组名指针变量指针变量数组名数组名数组名数组名指针变量指针变量指针变量指针变量2022-4-3046指针与一维数组指针与一维数组2022-4-3047例例:用函数实现将一维数组用函数实现将一维数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放void inv(int x,int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+)

22、j=n-1-i; t=xi; xi=xj; xj=t; void main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参与形参均用数组实参与形参均用数组2022-4-3048void inv(int *x,int n) int t,*p,*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; voi

23、d main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);实参用数组实参用数组,形参用指针变量形参用指针变量例例:用函数实现将一维数组用函数实现将一维数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放2022-4-3049void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,

24、j-) t=*i; *i=*j; *j=t; void main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d,*p);实参与形参均用指针变量实参与形参均用指针变量例例:用函数实现将一维数组用函数实现将一维数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放2022-4-3050void inv(int x, int n) int t,i,j,m=(n-1)/2; for(

25、i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; void main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d ,*p);实参用指针变量实参用指针变量,形参用数组形参用数组例例:用函数实现将一维数组用函数实现将一维数组a中的中的n个整数按相反顺序存放个整数按相反顺序存放2022-4-3051一级指针变量与一维数组的关系一级指针变量与一维数组的关

26、系2022-4-3052指针与二维数组指针与二维数组2022-4-3053int a34;a0a1a2200020162032200020042016202020322036a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2*(*(a+0)+1)*(a0+1)基类型基类型行指针与列指针行指针与列指针a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+12022-4-3054int a34;a0a1a2200020162032200020042016202020322036a00a01a10a11a20a21a02a03a12a13a22a2

27、3aa+1a+22022-4-3055指针与二维数组指针与二维数组一维数组a a1 a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23行地址列地址列地址列地址a0+0 a0+1 a0+2 a0+3a2+0 a2+1 a2+2 a2+3a1+0 a1+1 a1+2 a1+3一维数组a2一维数组a1一维数组a0a0 a2 a+0 &a0 a+1 &a1 a+2&a2 2022-4-3056int a34;a00a01a10a11a20a21a02a03a12a13a22a23地址表示:地址表示:(1) a+1 (2) &a10

28、(3) a1(4) *(a+1)(5) (int *)(a+1)行指针行指针列指针列指针地址表示:地址表示:(1) &a12(2) a1+2(3) *(a+1)+2(4) &a00+6对应的二维数组元素表示形式:对应的二维数组元素表示形式:(1)a12(2)*(a1+2)(3)*(*(a+1)+2)(4)*(&a00+6)2022-4-3057行地址行地址转变成转变成列地址列地址指针与二维数组指针与二维数组2022-4-3058表示形式表示形式含义含义地址地址a二维数组名,数组首地址二维数组名,数组首地址a0,*(a+0),*a第第0行第行第0列元素地址列元素地址a+1

29、第第1行首地址行首地址a1,*(a+1)第第1行第行第0列元素地址列元素地址a1+2,*(a+1)+2,&a12第第1行第行第2列元素地址列元素地址*(a1+2),*(*(a+1)+2),a12第第1行第行第2列元素值列元素值2000200020162016202413int a34;2022-4-3059void main() 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) printf(n); printf(%4d ,*p); pint a34;a00a01a10a

30、11a20a21a02a03a12a13a22a23p=*a; p=&a00; p=*(a+0); p=a; 指向二维数组元素的指针变量指向二维数组元素的指针变量2022-4-3060指针与二维数组指针与二维数组n 指向指向一维数组的指针变量一维数组的指针变量n 定义形式:定义形式:数据类型数据类型 (*指针名指针名)一维数组维数一维数组维数; 例例: int (*p)4;( )不能少不能少int (*p)4与与int *p4不同不同p的值是一维数组的首地址的值是一维数组的首地址,p是是行指针行指针2022-4-3061一维数组指针变量维数和一维数组指针变量维数和二维数组二维数组列数列

31、数必须相同必须相同int a34;a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2p0+1或或*p+1p1+2或或*(p+1)+2*(*p+1)或或 (*p)1 *(*(p+1)+2)2022-4-3062用各种方法访问二维数组各元素用各种方法访问二维数组各元素#include void main() int aa34= 1,2,3,4,5,6,7,8,9,10,11,12; int i,j,*p,(*pa)4;/第一种方法第一种方法 for (pa=aa,i=0;i3;i+)/pa是行指针是行指针 printf(n); for(j=0;j4

32、;j+) printf(%5d,paij); 2022-4-3063/第二种方法第二种方法 for (pa=aa;paaa+3;pa+) printf(n); for (j=0;j4;j+) printf(%5d,(*pa)j); /第三种方法第三种方法 for(p=&aa00;p&aa00+3*4;p+) if(p-&aa00)%4=0) printf(n); printf(%5d,*p); 2022-4-3064例例:二维数组指针变量举例二维数组指针变量举例int main() int a34= 1,3,5,7,9,11,13,15,17,19,21,23; int

33、 i,j,(*p)4; for(p=a,i=0;i3;i+,p+) for(j=0;j4;j+) printf(%d ,*(*p+j); printf(n); return 0;pint a34;a00a01a10a11a20a21a02a03a12a13a22a23p0jp=a0; p=*a; p=&a00; p=&a0; 2022-4-3065例例:二维数组与指针运算二维数组与指针运算void main() int a34= 1,2,3,4,3,4,5,6,5,6,7,8; int i; int (*p)4=a,*q=a0; for(i=0;i3;i+) if(i=0) (

34、*p)i+i/2=*q+1; else p+,+q; for(i=0;i3;i+) printf(%d,aii); printf(%d,%dn,*(int *)p),*q);123434565678pq2运行结果:运行结果:2,4,7,5,32022-4-3066答案:答案:d例例2022-4-3067若若int a34; int (*p1)4=a; int *p2=a0;实参实参形参形参数组名数组名int x4指针变量指针变量int (*q)4数组名数组名int x4指针变量指针变量int (*q)4数组名数组名a数组名数组名a指针变量指针变量p1指针变量指针变量p1指针变量指针变量p2指针

35、变量指针变量int *q2022-4-3068指针与二维数组指针与二维数组2022-4-3069输入一个输入一个3行行4列的二维数组,然后输出这个二维列的二维数组,然后输出这个二维数组的元素值数组的元素值 #include #define N 4void InputArray(int pN,int m,int n);void OutputArray(int pN,int m,int n);int main()int a34; printf(Input 3*4 numbers:n); InputArray(a,3,4); OutputArray(a,3,4); return 0;2022-4-3

36、070void InputArray(int pN,int m,int n) int i,j; for(i=0;im;i+) for(j=0;jn;j+)scanf(%d,&pij);void OnputArray(int pN,int m,int n) int i,j; for(i=0;im;i+) for(j=0;jn;j+)printf(%4d,pij);形参声明为列数已知的形参声明为列数已知的二维数组二维数组2022-4-3071void InputArray(int (*p)N,int m,int n) int i,j; for(i=0;im;i+) for(j=0;jn;j

37、+)scanf(%d,*(p+i)+j);void OnputArray(int (*p)N,int m,int n) int i,j; for(i=0;im;i+) for(j=0;jn;j+)printf(%4d, *(*(p+i)+j);形参声明为形参声明为指向指向列数已列数已知的二维数组知的二维数组的行指针的行指针2022-4-3072void InputArray(int *p,int m,int n) int i,j; for(i=0;im;i+) for(j=0;jn;j+)scanf(%d,&pi*n+j);void OnputArray(int *p,int m,in

38、t n) int i,j; for(i=0;im;i+) for(j=0;jn;j+)printf(%4d, pi*n+j);形参声明为形参声明为指向指向二维数二维数组组的的列列指针指针2022-4-3073#include #define N 4void InputArray(int *p,int m,int n);void OutputArray(int *p,int m,int n);int main()int a34; printf(Input 3*4 numbers:n); InputArray(*a,3,4);/*向函数传递二维数组的第向函数传递二维数组的第0行第行第0列的地址列的

39、地址*/ OutputArray(*a,3,4);/*向函数传递二维数组的第向函数传递二维数组的第0行第行第0列的地址列的地址*/ return 0;输入一个输入一个3行行4列的二维数组,然后输出这个二维列的二维数组,然后输出这个二维数组的元素值数组的元素值 2022-4-3074例例:求求3行行4列二维数组中的最大元素列二维数组中的最大元素(第一种方法第一种方法)int max_value(int (*pa)4,int row);/数组整体传递数组整体传递int main() int aa34=1,3,5,7,2,4,6,8,20,15,32,12; printf(max element i

40、s %dn,max_value(aa,3); return 0;int max_value(int (*pa)4,int row) int i,j,m=pa00; for (i=0;irow;i+) for (j=0;jm) m=paij; return(m);2022-4-3075int max_value(int *p,int n);/传数组元素传数组元素int main() int aa34=1,3,5,7,2,4,6,8,20,15,32,12; int max; max=max_value(&a00,3*4); printf(max element is %dn,max);

41、return 0;int max_value(int *p,int n) int i,m=*p; for (i=0;im) m=*p; return(m);例例:求求3行行4列二维数组中的最大元素列二维数组中的最大元素(第二种方法第二种方法)2022-4-3076例例:3个学生各学个学生各学4门课,计算总平均分,并输出第门课,计算总平均分,并输出第n个学生成绩个学生成绩int main()void average(float *p,int n); void search(float (*p)4,int n); float score34= 65,67,79,60,80,87,90,81, 90

42、,99,100,98; average(*score,12); search(score,2); return 0;void average(float *p,int n)float *p_end,sum=0,aver; p_end=p+n-1;/设置扫描的终止条件设置扫描的终止条件 for(;p=p_end;p+) sum=sum+(*p); aver=sum/n; printf(average=%5.2fn,aver);void search(float (*p)4,int n)int i; printf(No.%d:n,n); for(i=0;i4;i+) printf(%5.2f,*(

43、*(p+n)+i);列指针列指针行指针行指针函数说明函数说明float p4655279608087908190 9910098pp2022-4-3077二维数组与一维数组指针变量的关系二维数组与一维数组指针变量的关系2022-4-3078字符串与字符数组、字符指针字符串与字符数组、字符指针2022-4-3079指针与字符串指针与字符串例:例:int main( ) char string=I love China!; printf(%sn,string); printf(%sn,string+7); return 0; IloveChistring0string1string2string3

44、string4string5string6string7string8string9stringstring10string11string12string13n!a0结束标志结束标志2022-4-3080例例:void main( ) char *string=I love China!; printf(%sn,string); string+=7; while(*string) putchar(string0); string+; putchar(n);stringIloveChin!a0字符指针字符指针初始化初始化:把字符串把字符串首地址首地址赋给赋给string char *strin

45、g; string=I love China!;*string!=02022-4-3081字符指针变量与字符数组的区别字符指针变量与字符数组的区别2022-4-3082字符指针变量与字符数组的区别字符指针变量与字符数组的区别2022-4-3083n 在定义一个数组时,在编译时即分配单元,有确定地址,在定义一个数组时,在编译时即分配单元,有确定地址,而定义一个字符指针变量时,如未对它赋初值,则其所指而定义一个字符指针变量时,如未对它赋初值,则其所指数据是不定的,数据是不定的,因而使用是危险的。因而使用是危险的。n 字符指针字符指针接受键入字符串时接受键入字符串时,必须先开辟存储空间必须先开辟存储

46、空间例例:char str10; scanf(%s,str); 而而 char *cp; scanf(%s,cp); ( )( )改为改为:char *cp,str10; cp=str; scanf(%s,cp); ( ) char *str1=c,*str2=c; str1=asdfghjkl; str2=1234567890; printf(str1=%sn,str1); printf(str2=%sn,str2); 2022-4-3084n 字符指针变量可以指向程序中的任何字符串,如字符指针变量可以指向程序中的任何字符串,如printf()函函数中的格式字符串。数中的格式字符串。#inc

47、lude int main( ) int a=1;float b=2;char *format;format=a=%d,b=%fn;printf(format,a,b);return 0;n 用字符数组虽然也能实现用字符数组虽然也能实现 char format=a=%d,b=%fn;2022-4-3085字符串与字符数组的关系字符串与字符数组的关系2022-4-3086字符串指针作函数参数字符串指针作函数参数例例:用函数调用实现字符串复制用函数调用实现字符串复制-用字符数组作参数用字符数组作参数void copy_string(char from,char to) int i=0; while

48、(fromi!=0) toi=fromi; i+; toi=0;void main() char a=I am a teacher.; char b=You are a student.; printf(string_a=%snstring_b=%sn,a,b); copy_string(a,b); printf(nstring_a=%snstring_b=%sn,a,b);2022-4-3087例例:用函数调用实现字符串复制用函数调用实现字符串复制-用字符指针变量作参数用字符指针变量作参数void copy_string(char *from,char *to) for(;*from!=0;

49、from+,to+) *to=*from; *to=0;void main()char *a=I am a teacher.; char *b=You are a student.; printf(string_a=%snstring_b=%sn,a,b); copy_string(a,b); printf(nstring_a=%snstring_b=%sn,a,b);char b=You are a student.;2022-4-3088例例:用函数调用实现字符串复制用函数调用实现字符串复制-用字符指针变量作参数用字符指针变量作参数void copy_string(char *from,c

50、har *to) for(;*from!=0;from+,to+) *to=*from; *to=0;void main()char *a=I am a teacher.; char b=You are a student.; char *p=b; printf(string_a=%snstring_b=%sn,a,b); copy_string(a,p); printf(nstring_a=%snstring_b=%sn,a,b);while(*from)!=0) *to+=*from+;*to=0;while(*to=*from)!=0) from+;to+; while(*to+=*fr

51、om+)!=0);用用while改写改写2022-4-3089计算实际字符个数计算实际字符个数 2022-4-3090计算实际字符个数计算实际字符个数 2022-4-3091void main() int a,b,k=4,m=6,*p1=&k,*p2=&m; a=p1=&m; b=(-*p1)/(*p2)+7; printf(a=%dn,a); printf(b=%dn,b); 执行以下程序后的输出结果为?执行以下程序后的输出结果为?2022-4-3092下面程序的功能是将字符串下面程序的功能是将字符串s中的内容按逆序输出,但中的内容按逆序输出,但不改变串中的内容,请选

52、择填空。不改变串中的内容,请选择填空。#include int inverp(char *a) if(【1】) return 0; inverp(a+1); printf(%c,【2】 ); return 1; void main( ) char s10=hello; if( inverp(s) ) printf(nOKn); 【1】A)*a!=0 B)*a!=NULL C)!*a D)!*a=0【2】A)*(a-1) B)*a C)*(a+1) D)*(a-)2022-4-3093 #include #include void main( ) char *s1=AbDeG,*s2=AbdEg

53、; s1+=2;s2+=2; printf(%dn,strcmp(s1,s2);A)正数)正数 B)负数)负数C)零)零 D)不确定的值)不确定的值执行以下程序后的输出结果为?执行以下程序后的输出结果为?2022-4-3094void fun(char *w,int n) char t,*s1,*s2; s1=w;s2=w+n-1; while(s1y) z=x; else z=y; return(z);2022-4-30104用函数指针变量调用函数,比较两个数大小用函数指针变量调用函数,比较两个数大小void main() int max(int ,int), (*p)(int,int);

54、int a,b,c; p=max; scanf(%d,%d,&a,&b); c=(*p)(a,b); printf(a=%d,b=%d,max=%dn,a,b,c);int max(int x,int y) int z; if(xy) z=x; else z=y; return(z);2022-4-30105void main() int a,b,max(int,int),min(int,int),add(int,int); void process(int,int,int (*fun)(int,int); scanf(%d,%d,&a,&b); process

55、(a,b,max); process(a,b,min); process(a,b,add);void process(int x,int y,int (*fun)(int,int) int result; result=(*fun)(x,y); printf(%dn,result);int max(int x,int y) printf(max=); return(xy?x:y);int min(int x,int y) printf(min=); return(xy?x:y);int add(int x,int y) printf(sum=); return(x+y);用函数指针变量作函数参

56、数,求最大、最小值和两数之和用函数指针变量作函数参数,求最大、最小值和两数之和2022-4-30106返回指针值的函数返回指针值的函数例如:编一个函数连接两个字符串,然后返回连接后字符例如:编一个函数连接两个字符串,然后返回连接后字符串的首地址串的首地址2022-4-30107返回指针值的函数返回指针值的函数char *MyStrcat(char *dstStr, char *srcStr) char *pStr = dstStr; while (*dstStr != 0) dstStr+; for(; *srcStr!=0; dstStr+, srcStr+) *dstStr = *srcS

57、tr; *dstStr = 0; return pStr; #includechar *MyStrcat(char *dstStr, char *srcStr); void main() char first80 = Hello ; char second80 = world; char *result = NULL; result = MyStrcat(first, second); printf(nThe result is : %sn, result);这个字符数组应这个字符数组应该保证足够大该保证足够大2022-4-30108指针函数实现:若干学生成绩,要求输入学生序号后,能指针函数实

58、现:若干学生成绩,要求输入学生序号后,能输出其全部成绩输出其全部成绩void main() float score3=60,70,80,56,89,67,34,78,90; float *search(float (*pointer)3,int n), *p; int i,m; printf(Enter the number of student:); scanf(%d,&m); printf(The scores of No.%d are:n,m); p=search(score,m); for(i=0;i*y)return x; elsereturn y;void main() i

59、nt a=2,b=3; int *p; p=f1(&a, &b); printf(%dn,*p);.20002016200420082012a p by x23*20002004调用前调用前调用中调用中调用结束调用结束20042022-4-30110写一个函数,求两个写一个函数,求两个int型变量中较大值变量的地址型变量中较大值变量的地址int *f2(int x,int y) if(xy)return &x; elsereturn &y;void main() int a=2,b=3; int *p; p=f2(a, b); printf(%dn,*p);.2

60、0002016200420082012a p by x23*23调用前调用前调用中调用中调用结束调用结束2016不能返回不能返回形参形参或或局部变量局部变量的的地址地址作函数返回值作函数返回值2022-4-30111pStr5*char指针所指向变量的数据类型指针所指向变量的数据类型区分区分char *pStr5与与char (*p)5指针数组指针数组2022-4-30112p0p1p2p3赋值赋值:void main() char a=Fortran; char b=Lisp; char c=Basic; char *p4; p0=a; p1=b; p2=c; p3=NULL; .或或:void main() char *p4; p0= Fortran; p1= Lisp; p2= Basic; p3=NULL; 指针数组赋值与初始化指针数组赋值与初始化2022-4-30113strstr0Pascalstr1str2str3BasicFortranJava二维数组二维数组字符串字符串Visual Cstr4指针数组赋值与初始化指针数组赋值与初始化2022-4-30114指针数组赋值与初始化指针数组赋值与初始化ptrptr0Pascalptr1ptr2ptr3BasicFortranJava指针指针数组数组字符串字符串Visual Cptr4

温馨提示

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

评论

0/150

提交评论