大学《C语言程序设计》课件-第8章

上传人:文** 文档编号:370235041 上传时间:2023-11-30 格式:PDF 页数:47 大小:1.50MB
返回 下载 相关 举报
大学《C语言程序设计》课件-第8章_第1页
第1页 / 共47页
大学《C语言程序设计》课件-第8章_第2页
第2页 / 共47页
大学《C语言程序设计》课件-第8章_第3页
第3页 / 共47页
大学《C语言程序设计》课件-第8章_第4页
第4页 / 共47页
大学《C语言程序设计》课件-第8章_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《大学《C语言程序设计》课件-第8章》由会员分享,可在线阅读,更多相关《大学《C语言程序设计》课件-第8章(47页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计C Programming22016第8章 指针与函数指针与函数3指针型数据4 P41 图2-2 int val=-10;&val8.1.1 地址的概念58.1.1 地址的概念 例2.5int main(void)int i;char c;float f;printf(%p,%p,%p,&i,&c,&f);return 0;68.1.2 指针变量声明及初始化 一个变量的地址称为该变量的指针。不同的计算机中表示地址的方式不同,所以给指针型变量分配的存储空间大小也不同。当一个指针变量存储了某个变量的地址后就称该指针变量指向那个变量。7指针变量声明及初始化 指针变量声明的一般形式存储类

2、型存储类型数据类型数据类型*变量名变量名 数据类型:不是指针变量本身的数据类型,而是指针变量所指向对象的数据类型,称为基类型。基类型限定了指针变量只能用于存放基类型对象的地址。指针类型指示符:*用来指出其后的变量名被定义成指针类型。8int*integer_pointer;float*f_p;char*c_p;指针变量声明及初始化9在sizeof(int)=2的编译环境下,程序的输出结果是_int*p1;float*p2;printf(%d,%dn,sizeof(p1),sizeof(p2);(A)2,4(B)2,2(C)4,4(D)4,2B思考10 通过赋值表达式int x=1085;int

3、*p,*p1;p=&x;p1=p;声明指针变量的同时给指针变量置初始值int x=1085;int*p=&x,*p1=p;指针变量声明及初始化11指针变量声明及初始化 指针变量的初始化 定义指针变量的同时给指针变量置初始值。int val,x=1085;int*p=&x,*p1=p;定义时未给定初值,则:外部与static型指针变量初值自动为0(NULL)局部与非static型指针变量在没有指定初值之前其值无定义(其值不确定),不应直接使用!12指针变量声明及初始化 空指针变量与未定义指针变量 空指针变量:指针变量的值为0,表示指针变量未指向任何对象。int*p=0;或int*p=NULL;未

4、定义指针变量:值是不确定的,它可能指向一个不可预知的存储单元,如果通过它访问指向的对象将造成无法预测的后果。13指针变量声明及初始化 无基类型指针变量 定义形式void *指针变量名;用途可用来存储任何一种数据类型对象的地址,可以在需要的时候通过强制类型转换把它的值赋给另一个具有确定基类型的指针变量。14已知int a,*p=&a;则下列函数调用中错误的是_(A)scanf(%d,&a);(B)scanf(%d,p);(C)printf(%d,a);(D)printf(%d,p);有四组对指针变量进行操作的语句,以下判断正确的选项是_(A)int*p,*q;*q=*p;int a,*p,*q;

5、p=q=&a;(B)int a,*p,*q;q=&a;p=*q;int a=20,*p;*p=a;(C)int a=b=0,*p;p=&a;b=*p;int a=20,*p,*q=&a;*p=*q;(D)int a=20,*p,*q=&a;p=q;int p,*q;q=&p;DD思考15有如下语句 int a=10,b=20,*p1,*p2;p1=&a;p2=&b;如图1所示,若要实现图2所示的存储结构,可选用的赋值语句是_p110a20p2b图120p2bp110a图2(A)*p1=*p2;(B)p1=p2;(C)p1=*p2;(D)*p1=p2;B168.1.3 间接引用运算与间接引用数据

6、对象 数据对象 数据对象的存和取 数据对象的直接引用 例:a 数据对象的间接引用例:*p 取地址运算&(左值对象)间接引用运算符*int i,*p=&i;p=?*p=?&*p=?*&i=?17#includeintmain()int*p,*p1,*p2,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(na=%d,b=%dnn,a,b);printf(max=%d,min=%dn,*p1,*p2);return 0;设输入值为20,308.1.3 间接引用运算与间接引用数据对象188.2 函数中的指针8.2.1 形参

7、是指针(传递地址)形式参数的数据类型是指针类型,函数调用时实参向该形参传递的应是与其形参基类型相同的对象地址。用运算符&得到的对象地址或指向对象的指针均可用作实参。被调函数通过指针类型形参可以访问主调函数中声明的局部数据对象。20数据交换例#include void swap(int*x,int*y)int t;t=*x;*x=*y;*y=t;int main(void)int a=20,b=30/int*p1=&a,*p2=&b;swap(&a,&b);printf(a=%d,b=%d,a,b);return 0;xyp1p2ab1101121101122030100102104106108

8、11011221数据交换例 下面的程序是否对?void swap(int*p1,int*p2)int*p;*p=*p1;*p1=*p2;*p2=*p;int main()int a,b,*pt1=&a,*pt2=&b;scanf(%d,%d,pt1,&b);if(ab)swap(pt1,pt2);printf(n%d,%dn,a,b);return 0;/若改若改为intint k,*p=&k;k,*p=&k;22下面程序的结果是?swap(int x,int y)int p;p=x;x=y;y=p;int main()int a,b,*pt1=&a,*pt2=&b;scanf(%d,%d,&

9、a,&b);if(ab)swap(*pt1,*pt2);printf(n%d,%dn,*pt1,*pt2);23数据交换例 下面程序的结果是?swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;int main()int a,b,*pt1=&a,*pt2=&b;scanf(%d,%d,&a,&b);if(ab)swap(pt1,pt2);printf(n%d,%dn,*pt1,*pt2);return 0;24数据交换例结论?#include int main()int*p,*p1,*p2,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if

10、(ab)p=p1;p1=p2;p2=p;printf(na=%d,b=%dnn,a,b);printf(max=%d,min=%dn,*p1,*p2);return 0;25数据交换例例:输入a,b,c三个整数,按从大到小顺序输出void swap(int*pt1,int*pt2)int p;p=*pt1;*pt1=*pt2;*pt2=p;void big_small(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2*q3)swap(q2,q3);26int main()int a,b,c,*p1,*

11、p2,*p3;scanf(%d,%d,%d,&a,&b,&c);/p1=&a;p2=&b;p3=&c;p1=&a;p2=&b;p3=&c;/scanf(%d,%d,%d,p1,p2,p3);big_small(p1,p2,p3);printf(n%d,%d,%dn,a,b,c);return 0;27数据交换例通过指针变量改变主调函数中变量值的方法int f(int*x).*x=3;int main()int n;f(&n);28小结:函数间数据通信的实现 通过非指针型形式参数和return语句实现函数之间的通信#include int f(int x,int y)return x+y;int

12、 main(void)int a=1,b=2,c;c=f(a,b);printf(%d,c);return 0;29小结:函数间数据通信的实现 通过指针型形式参数实现函数之间的通信。#include int f(int x,int y,int*p)*p=x-y;return x+y;int main(void)int a=1,b=2,c,d;c=f(a,b,&d);printf(a+b=%d,a-b=%d,c,d);return 0;30小结:函数间数据通信的实现 通过外部变量实现函数之间的通信#include int x,y,z,w;void f()z=x+y;w=x-y;int main(

13、void)int a=1,b=2;x=a;y=b;f();printf(a+b=%d,a-b=%d,z,w);return 0;318.2.2 函数返回值为指针 当函数的返回值类型为指针类型时,应返回指针类型形式参数的值或static型局部变量的地址。例如char*f(char*x,char y)char z=y;*x=y;return&z;static328.2.3 间接函数调用 函数名是一个指针类型的常量。若将一个函数的函数名保存到了一个指针变量中,则这个指针变量便指向该函数。间接函数调用用指向函数的指针、圆括号及实在参数表调用函数的形式。声明指向函数的指针变量一般形式函数返回值类型(*指

14、针变量名)(形式参数类型表);34 用指向函数的指针间接调用有参函数一般形式指针(实参表)或(*指针)(实参表)用指向函数的指针间接调用无参函数一般形式指针()或(*指针)()8.2.3 间接函数调用35#include#include int main(void)double(*pf)(double,double);/声明指向函数的指针变量pf=pow;printf(%f,pf(2,3);/或 printf(%f,(*pf)(2,3);return 0;8.2.3 间接函数调用36注意pf+n,pf-n,pf+,pf-等运算是无意义的#include#include#include doub

15、le ctan(double x)return 1/tan(x);int main(void)double(*pf)(double),x;char cmd;printf(n Intput a value:);scanf(%lf,&x);printf(n Intput a command:);8.2.3 间接函数调用37printf(n 1.sin(x)n 2.cos(x)n 3.tg(x)n 4.ctg(x)n Input choice:);cmd=getch();switch(cmd)case 1:pf=sin;break;case 2:pf=cos;break;case 3:pf=tan;

16、break;case 4:pf=ctan;printf(n%f,pf(x);return 0;8.2.3 间接函数调用38指向函数的指针作为形参传递函数地址 形式参数的数据类型是指向返回T类型值函数的指针类型 函数调用时实参向该形参传递的应是返回值类型为T的函数地址 函数名或指向函数的指针均可用作实参 被调函数内部通过该指针类型形参可以间接调用其他函数398.2.3 间接函数调用long f(int n)int i,fac=1;for(i=1;i=n;i+)fac*=i;return fac;void g(long(*l)(int),int m,int n)int k;for(k=m;kn;k+)printf(%2d!=%ldn,k,(*l)(k);int main()g(f,0,12);g(f,3,12);return 0;40#include#includevoid g(double(*l)(double),int m,int n)int k;for(k=m;kn;k+)printf(%2d)=%fn,k,l(k);int main()g(sqrt,0,12);g(sin,2,15

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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