《语言指针学习.pptx》由会员分享,可在线阅读,更多相关《语言指针学习.pptx(106页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学习目标了解指针的意义和基本概念掌握指针变量的定义和引用指针和数组指针和函数指针变量以及指向指针变量的应用指针变量作函数参数与普通变量作函数参数的异同第1页/共106页10.1 指针的概念程序中:int i;float k;内存中每个字节有一个编号-地址ik 编译或函数调用时为其分配内存单元,对变量值的存取都是通过地址进行的。这种按变量地址存取变量值的方式称为“直接访问”方式.内存ik200020012002200502003内存单元的地址内存单元的内容返回第2页/共106页指针的概念指针的定义:一个变量的地址称为该变量的指针。第3页/共106页指针的概念.2000200420062005整型
2、变量i10变量i_pointer2001200220032000指针指针变量 变量的内容 变量的地址通过存放变量地址的变量去访问变量的方式称为“间接访问”方式。第4页/共106页10.2 变量的指针和指向变量的指针变量指针变量的定义指针变量的引用指针变量做为函数参数返回第5页/共106页指针变量的定义指针变量的定义指针变量是专门用来存放变量的地址的(即指针的)。3变量i2000i_pointer指针变量变量变量地址(指针)变量值指向地址存入指针变量指针变量同其所指向的变量之间的关系第6页/共106页指针变量的定义形式类型名 *指针变量名1,*指针变量名2,.;合法标识符*是说明符,表示该变量是
3、一个指针变量,而不是*运算符指针的目标变量的数据类型例 int *p1,*p2;float *q;static char *name;注意:1、int *p1,*p2;与 int *p1,p2;2、指针变量名是p1,p2,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,应用前必须先赋值指针变量的定义第7页/共106页指针变量的定义指针变量的初始化方法一:通过求地址运算(&)获得地址值例:int i;int *p=&i;变量必须已说明过类型应一致例:int *p=&i;int i;第8页/共106页指针变量的定义方法二:利用另一个指针变量赋值例:in
4、t i;int *p=&i;int *q=p;用已经初始化指针变量作初值第9页/共106页指针变量的定义注意:指针变量中只能存放地址(指针)不要将一个整型量(或其它非地址类型的数据)赋给一个指针变量。例:int *pointer_1;pointer_1=100;编译不会出错,但是会出现警告信息。Assignment makes pointer from integer without a cast.第10页/共106页指针变量的引用指针变量的引用:&和*运算符含义:取变量的地址单目运算符优先级:2结合性:自右向左含义:取指针所指向的变量容单目运算符优先级:2结合性:自右向左两者关系:互为逆运算
5、第11页/共106页.2000200420062005整型变量i10变量i_pointer2001200220032000指针变量指针变量的引用i_pointer-指针变量,它的内容是地址量*i_pointer-指针的目标变量,它的内容是数据&i_pointer-指针变量占用内存的地址200010i_pointer*i_pointer&i_pointerii_pointer&i&(*i_pointer)i *i_pointer *(&i)i_pointer =&i =&(*i_pointer)i =*i_pointer =*(&i)第12页/共106页指针变量的引用例:char i,j,*p1
6、,*p2;i=a;j=b;p1=&i;p2=&j;*p2=*p1;例:char i,j,*p1,*p2;i=a;j=b;p1=&i;p2=&j;p2=p1;比较以下两段程序,分析它们的差异?第13页/共106页指针变量的引用例:main()int a,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf(%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);第14页/共106页指针变量的引用例10.1 输入两个数,并使其从大到小输出main()int*p1,*p2
7、,*p,a,b;scanf(%d,%d,&a,&b);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);5a9b&ap1&bp2p5a9b&ap1&bp2pa和b的值并没有改变,改变的是指针变量p1和p2的值,使得p1指向大的数,而p2指向较小的数。第15页/共106页变量的指针和指向变量的指针变量注意:指针变量必须先赋值,再使用例 main()int i=10;int *p;*p=i;printf(“%d”,*p);危险!例 main()int i=10,k;int
8、*p;p=&k;*p=i;printf(“%d”,*p);.2000200420062005整型变量i10指针变量p200120022003随机第16页/共106页指针变量的引用指针变量的运算1指针的移动 a0a1a2a3a4a5a6a7a8a9a数组pp+1p+ip+9pi p id (i为整型数,d为p指向的变量所占字节数)例:p指向float数,则 p+1 p+1 4例:p指向int型数组 且 p=&a0;则 p+1 指向a1例:int a10;int *p=&a2;p+;*p=1;1当指针指向一串基类型相同的连续的存储单元时,指针的移动才有实际意义。一般对指向数组的指针变量进行加减运算
9、。若p是指向数组的指针变量,则p+,p-,p+i,p-i,p+=i,p-=i等有意义第17页/共106页指针变量的引用指针变量的运算2指针变量相减若p1与p2指向同一数组,p1-p2 两指针间元素个数 (p1-p2)/d例:int a10;int*p1=&a2;int*p2=&a5;则:p2-p1=3;注意:p1+p2无意义第18页/共106页指针变量的引用指针变量的运算3指针的比较若p1和p2指向同一数组,则p1p2 表示p1指的元素在后p1=p2 表示p1与p2指向同一元素若p1与p2不指向同一数组,比较无意义第19页/共106页指针变量的引用空指针#define NULL 0int*p=
10、NULL;p指向地址为0的单元,系统保证该单元不作它用表示指针变量值没有意义注意:p=NULL 与 未对p赋值不同第20页/共106页思考题分析以下两个表达式的含义1.(*pointer_1)+2.*(pointer_1+)3.*pointer_1+应注意区分是移动指针操作还是一般算术操作。请查看实训P133页的部分第21页/共106页指针变量做为函数参数swap(int x,int y)int temp;temp=x;x=y;y=temp;main()int a,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(n%d,%dn,a,b);例10.2 将数
11、从大到小输出(方法一:值传递).20002008200A2002200420065变量a 变量b(main)9559 59 变量temp 变量y 变量x(swap)第22页/共106页swap(int x,int y)int temp;temp=x;x=y;y=temp;main()int a,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(n%d,%dn,a,b);例10.3 将数从大到小输出(方法一:值传递方).20002008200A2002200420065变量a 变量b(main)9值传递运行结果:5,9运行结果不正确第23页/共106页指针变
12、量作为函数参数swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);例10.4:将数从大到小输出(方法二:指针类型的数据作函数参数)a59b&apointer_1&bpointer_2pointer_259b&apointer_1&b&ap1&bp2第24页/共106页swap(int
13、*p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);pointer_259b&apointer_1&b&ap1&bp2pointer_295b&apointer_1&ap1&bp2&b第25页/共106页swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;mai
14、n()int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);pointer_295b&apointer_1&ap1&bp2&ba95b&apointer_1&bpointer_2第26页/共106页swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,
15、&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);思考:本例所采取的方法是什么:交换a和b的值,而p1和p2的值不变。第27页/共106页a95b&apointer_1&bpointer_2第四步指针变量作为函数参数a59b&apointer_1&bpointer_2第一步pointer_259b&apointer_1&b&ap1&bp2第二步pointer_295b&apointer_1&ap1&bp2&b第三步小结:为使在函数中改变了的变量值能被主调函数所用,不能采用把要
16、改变值的变量作为参数的办法(值传递)。而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后这些变量值的变化依然保留下来,这样就实现了“调用函数改变变量的值,在主调函数中使用这些改变了的值”的目的。第28页/共106页指针变量作为函数参数观察下列程序,判断是否能正确完成“将两数按从大到小”顺序输出swap(int*p1,int*p2)int*p;*p=*p1;*p1=*p2;*p2=*p;main()int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;
17、if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);编译警告!结果不对!指针变量在使用前必须赋值!第29页/共106页指针变量作为函数参数思考:下列程序段能否正确实现“将数从大到小”输出swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;main()int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(%d,%d,*pointer_1,
18、*pointer_2);a59b&apointer_1&bpointer_2pointer_259b&apointer_1&b&ap1&bp259b&apointer_1&ap1&bp2pointer_2&baa59b&apointer_1&bpointer_2注意:不能企图通过改变指针形参的值而使指针实参的值也改变。第30页/共106页10.3 数组的指针和指向数组的指针变量指向数组元素的指针变量的定义 与赋值通过指针引用数组元素数组名做函数参数指向多维数组的指针和指针变量返回第31页/共106页指向数组元素的指针变量的定义与赋值指向数组元素的指针变量的定义与赋值例 int array10;
19、int *p;p=&array0;p=array;或 int *p=&array0;或 int *p=array;p&array0array0array1array2array3array9.123数组名是表示数组首地址的地址常量第32页/共106页指向数组元素的指针变量的定义与赋值指针变量的赋值运算小结1.p=&a;(将变量a地址p)2.p=array;(将数组array首地址p)3.p=&arrayi;(将数组元素地址p)4.p1=p2;(指针变量p2值p1)不能把一个整数p,也不能把p的值整型变量如 int i,*p;p=1000;()i=p;()第33页/共106页通过指针引用数组元素
20、通过指针引用数组元素指针移动原则:假设p定义为指针变量,使它指向某一个数组元素,则c规定p+1指向数组的下一个元素,而p+1所代表的地址实际上是p+1d,d是一个数组元素所占的字节数。第34页/共106页通过指针引用数组元素a0a1a2a3a4a5a6a7a8a9a数组pp+1,a+1p+i,a+ip+9,a+9p+i和a+i表示数组元素ai的地址*(p+i)和*(a+i)表示数组元素ai编译时,对数组元素ai处理成*(a+i),即按数组首地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容。实际上是变址运算符,即将ai按a+i计算地址,然后找出此地址单元中的值。pi与*(p+i)等
21、价表示数组元素ai第35页/共106页通过指针引用数组元素引用一个数组元素小结:1.下标法ai2.指针法 *(a+i)或者*(p+i)a是数组名p是指向数组的指针变量,其初值为p=a第36页/共106页a0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2a3a9.pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)变址运算符ai *(a+i)ai pi *(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9第37页/共106页通过指针引用数组元素a0a1a2a3a4例:一维数组元素的引用方法main()int a5
22、,*pa,i;for(i=0;i5;i+)ai=i+1;pa=a;for(i=0;i5;i+)printf(*(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);12345第38页/共106页通过指针引用数组元素例:int a=1,2,3,4,5,6,7,8,9,10,*p=a,i;数组元素地址的正确表示:(A)&(a+1)(B)a+(C)&p (D)&pi数组名是地址常量p+
23、,p-()a+,a-()a+1,*(a+2)()第39页/共106页通过指针引用数组元素void main()int a=5,8,7,6,2,7,3;int y,*p=&a1;y=(*-p)+;printf(“%d ”,y);printf(“%d”,a0);输出:5 6例:注意指针变量的运算pp58762730123456a6第40页/共106页通过指针引用数组元素例:注意指针的当前值main()int i,*p,a7;p=a;for(i=0;i7;i+)scanf(%d,p+);printf(n);for(i=0;i7;i+,p+)printf(%d,*p);pp58762730123456
24、apppppp指针变量可以指到数组后的内存单元p=a;第41页/共106页通过指针引用数组元素数组名作函数参数实 参形 参数组名指针变量数组名指针变量数组名数组名指针变量指针变量main()int a10;.f(a,10);.f(int*x,int n).main()int a10;.f(a,10);.f(int arr,int n).main()int a10,*pn;pn=a;.f(pn,10);.f(int*x,int n).main()int a10,*pn;pn=a;.f(pn,10);.f(int arr,int n).第42页/共106页ij 3 7 9 11 0 6 7 5 4
25、 20 1 2 3 4 5 6 7 8 9ijijijji11760594723实参与形参均用数组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;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);m=4例10.5 将数组a中的n个整数按相反顺序存放(1)第43页/共106页void inv
26、(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;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);实参用数组,形参用指针变量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma数组60711594723ijijijjiji例10.6将数组a a中的n
27、 n个整数按相反顺序存放(2 2)第44页/共106页void 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+,j-)t=*i;*i=*j;*j=t;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);实参与形参均用指针变量例10.7 将数组a a中的n n个整数按相反顺序存放(3 3)第
28、45页/共106页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;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=arr;parr+10;p+)printf(%d,*p);实参用指针变量,形参用数组例10.8 将数组a中的n个整数按相反顺序存放(4)第46页/共106页数组名作函数参数 数组名可以做函数的实参和形参m
29、ain()int array10;f(array,10);f(arr,n)int arr,n;数组名作实参时实际上是把数组的首地址传递给形参,此时,形参数组和实参数组占用的是同一段内存,在调用过程中,改变形参数组元素实际上也是改变实参数组元素,调用结束后,虽然形参数组名不存在了,但对实参数组元素的操作效果已经造成了事实.第47页/共106页例10.9 将数组a中n个整数按相反顺序存放 算法:a0 an-1 a1 an-2 a(n-1)/2 a n-1-(n-1)/2)第48页/共106页第49页/共106页例10.10将上例中的形参x改为指针变量,以接收实参数组a传递来的地址,再设指针i,j,
30、p 指向有关元素,以实现数组元素的转换。第50页/共106页例10.11 从10个数中找出最大值和最小值,并分别存入全局量max,min中,在查找过程中 分析:指针:p:依次指向数组元素,array_end:指向最未元素后,array:指向array0所对应值.第51页/共106页第52页/共106页数组名作函数参数归纳:在被调用函数中改变数组的值,实参、形参的取值,有四种情况:(1)实、形参都是数组名 main()f(x,n)int a10 int x ,n;f(a,10);第53页/共106页数组名作函数参数(2)实参为数组名,形参为指针变量 main()f(x,n)int a10 int
31、 *x,n;f(a,10);第54页/共106页数组名作函数参数(3)形、实参都是指针变量 main()f(x,n)int a10,*p;int *x,n;p=a;f(p,10);第55页/共106页数组名作函数参数(4)实参为指针变量,形参为数组 main()f(x,n)int a10,*p;int x,n;p=a;f(p,10);第56页/共106页指向多维数组的指针和指针变量指向一维数组元素的指针小结:1.数组名array表示数组的首地址,即array0的地址;2.数组名array是地址常量;3.array是指向数组元素的指针;4.array+i是元素arrayi的地址;5.arrayi
32、 *(array+i)arrayint array10;第57页/共106页指向多维数组的指针和指针变量二维数组的理解例:int a34;20161720181920202120222320089201011201213201415200012002320045200067a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23每个元素每个元素aiai由包含由包含4 4个元素个元素的一维数组组成的一维数组组成二维数组二维数组a a是由是由3 3个元素组成个元素组成a0a1a2行名014523a01a02a03a10a11a00a13a20a21a22a23a1
33、267101189a0a1a2第58页/共106页指向多维数组的指针和指针变量二维数组的行指针和列指针第59页/共106页对于二维数组:(1)a是数组名,包含三个元素 a0,a1,a2(2)每个元素ai 又是一个一维 数组,包含4个 元素aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23基类型a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+1行指针列指针第60页/共106页 对二维数组 int a34,
34、有la-二维数组的首地址,即第0行的首地址la+i-第i行的首地址lai *(a+i)-第i行第0列的元素地址lai+j *(a+i)+j-第i行第j列的元素地址l*(ai+j)*(*(a+i)+j)aija+i=&ai=ai=*(a+i)=&ai0 值相等,含义不同la+i&ai,表示第i行首地址,指向行lai *(a+i)&ai0,表示第i行第0列元素地址,指向列int a34;a0a1a2200020082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2第61页/共106页int a34;a00a
35、01a10a11a20a21a02a03a12a13a22a23二维数组元素表示形式:(1)a12(2)*(a1+2)(3)*(*(a+1)+2)(4)*(&a00+1*4+2)地址表示:(1)&a12(2)a1+2(3)*(a+1)+2(4)&a00+1*4+2第62页/共106页指向多维数组的指针和指针变量表示形式含义地址a二维数组名,数组首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值20002000200820
36、08201213表格说明第63页/共106页指向多维数组的指针和指针变量main()static int a34=1,3,5,7,9,11,13,15,17,19,21,23;printf(%d,%dn,a,*a);printf(%d,%dn,a0,*(a+0);printf(%d,%dn,&a0,&a00);printf(%d,%dn,a1,a+1);printf(%d,%dn,&a10,*(a+1)+0);printf(%d,%dn,a2,*(a+2);printf(%d,%dn,&a2,a+2);printf(%d,%dn,a10,*(*(a+1)+0);第64页/共106页指向多维数组
37、的指针和指针变量指向二维数组元素的指针变量main()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)printf(n);printf(%4d ,*p);p=*a;p=&a00;p=*(a+0);p=a;p=*a;p=&a00;p=(int*)a;p=a;int a34;a00a01a10a11a20a21a02a03a12a13a22a23p第65页/共106页指向多维数组的指针和指针变量指向由m个数组元素组成的一维数组的指针变量定义形式:数据类型 (*指针名)一维数组维数
38、;()不能少int(*p)4与int*p4不同例:int (*p)4;p的值是一维数组的首地址,p是行指针第66页/共106页指向多维数组的指针和指针变量可让p指向二维数组某一行 例:int a34,(*p)4=a;指针变量p指向的一维数组维数和二维数组列数必须相同int a34;a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2p0+1或*p+1p1+2或*(p+1)+2*(*p+1)或(*p)1*(*(p+1)+2)第67页/共106页#include main()static int a34=1,3,5,7,9,11,13,15,17,1
39、9,21,23;int(*p)4,i,j;p=a;printf(nPlease input i and j:);scanf(%d%d,&i,&j);printf(a%d%d=%dn,i,j,*(*(p+i)+j);例10.12输出二维数组任一行任一列元素的值,行列由用户从键盘输入第68页/共106页指向多维数组的指针和指针变量指针数组定义:数组中的元素为指针变量定义形式:数据类型*数组名数组长度;例:int *p4;数组元素是指针,其所指向变量的数据类型注意:p是数组名,有4个数组元素,都为指针类型,指向整型变量区分 int *p4 与 int (*p)4第69页/共106页指向多维数组的指针
40、和指针变量用指针数组处理二维数组例:main()int b23,*pb2;pb0=b0;pb1=b1;.int *pb2pb0pb1int b23123246b0为列指针,指向第0行第0列数组元素,pb0为指向整型的指针,可以指向数组元素,则pb0+1指向下一个数组元素第70页/共106页指向多维数组的指针和指针变量小结:指向一维数组的指针变量和指针数组处理二维数组小结#define ROW 7#define COL 10int arrayROWCOL;指向一维数组的指针变量:int(*p)COL=array;p是行指针,p+i指向i行*(p+i)+j pi+j指向第i行第j列元素指针数组:i
41、nt*pROW=array0;pi是指向数组元素的指针,指向第i行第0列元素;pi+j指向第i行第j列元素第71页/共106页例10.13 二维数组与指针运算。main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i;int(*p)4=a,*q=a0;for(i=0;i3;i+)if(i=0)(*p)i+i/2=*q+1;else p+,+q;for(i=0;i3;i+)printf(%d,aii);printf(%d,%dn,*(int*)p),*q);运行结果:2,6,11,9,3123456789101112pq2pqpq第72页/共106页l用指向变
42、量的指针变量l用指向一维数组的指针变量l用二维数组名指向多维数组的指针和指针变量二维数组的指针作函数参数 用指向变量的指针变量 用指向一维数组的指针变量 用二维数组名实参形参数组名int x4指针变量int (*q)4数组名int x4指针变量int(*q)4数组名a数组名a指针变量p1指针变量p1若int a34;int (*p1)4=a;int *p2=a0;指针变量p2指针变量int *q第73页/共106页例10.143个学生各学4门课,计算总平均分,输出第n个学生成绩。main()void average(float *p,int n);void search(float (*p)4
43、,int n);float score34=65,67,79,60,80,87,90,81,90,99,100,98;average(*score,12);search(score,2);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
44、(%5.2f ,*(*(p+n)+i);列指针行指针函数说明float p46552796080879081909910098pp pni第74页/共106页例10.15 3个学生各学4门课,计算总平均分,并查找一门以上课及格学生,输出其各门课成绩。void search(float (*p)4,int n)int i,j,flag;for(j=0;jn;j+)flag=0;for(i=0;i4;i+)if(*(*(p+j)+i)60)flag=1;if(flag=1)printf(No.%d is fail,his scores are:n,j+1);for(i=0;iy)?x:y;retu
45、rn(z);main()int max();int(p)();int a,b,c;p=max;scanf(a=%d,b=%d,&a,&b);c=(p)(a,b)printf(max value=%d,c)第98页/共106页函数指针和指向函数的指针变量注意:int(*pmax)()不要写成 int*pmax()pmax=max:表示pmax和max都指向函数的开头用函数指针变量调用函数,和用函数名调用函数是一样的。调用函数的一般形式为:(*指针变量)(实参表)凡是指针变量不能进行算术运算第99页/共106页10.6 返回指针值的函数问题引入:既然函数返回值可以是整、实型等数据。当然也可以是指针
46、值,只是函数定义形式略有不同:类型标识符 函数名(形参表列)返回第100页/共106页例10.23有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。main()static float score 4=60,70,80 ,90,56,89,67,88,34,78,90,66;float*search();float*p;int i,m;printf(enter the number of student:);scanf(%d,&m);printf(The scores of No.%d are:n,m);第101页/共106页p=s
47、earch(score,m);for(i=0;i4;i+)printf(%5.2ft,*(p+i);float*search(pointer,n)float(*pointer)4;int n;float*pt;pt=*(pointer+n);return(pt);第102页/共106页定义含义int i;int *p;int an;int *pn;int (*p)n;int f();int*p();int(*p)();int*p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的
48、函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量指针的数据类型第103页/共106页总 结指针是一个变量,它存储另一个对象的内存地址指针的声明由基本类型、星号(*)和变量名组成为指针赋值,赋值运算符右侧必须是一个地址。如果是普通变量需要在前面加一个取地址运算符&;如果是另一个指针变量或者是一个数组,不需要加&运算符运算符*用于返回指针指向的内存地址中存储的值第104页/共106页指针的算术运算的含义是指针的移动,将指针执行加上或者减去一个整数值n的运算相当于指针向前或向后移动n个数据单元指针可以执行比较相等的运算,用来判断两个指针是否指向同一个变量指向数组的指针,存储的是数组中元素的地址。数组data的第(i+1)个元素的地址可表示为&datai 或(data+i)第105页/共106页感谢您的观看!第106页/共106页