指针1
如何提高牌坊式深度指示器指针精度1

牌坊式深度指示器指针的精度牌坊式深度指示器在当前的矿山的提升机领域里有着广泛的应用。
它也是矿井提升机重要的保护检测装置。
其主要作用有:1、向司机指示提升容器在井筒的实际位置;2、容器接近井口停车位置时发送减速信号;3、当提升容器过卷时,发出过卷信号,并进行安全保护。
一、存在问题:在实际使用中发现深度指示器的深度指针的行程范围偏小;在有的行程达不到整个行程的三分之二;尤其以200米以下的提升高度较明显。
这就大大影响深度指示器的精度;造成停车位置不准确,严重的会发生安全事故。
二、相关计算:这是牌坊式深度指示器附带的齿轮更换选用表,以此为例进行相关验算,加以说明。
2米提升机更换齿轮选用表提升高度(米)Z5 Z6 丝杠螺母K7115 K7116 K71151 齿数齿数螺距236 236 22 60 20mm236~364 236~364 330 18 64 20mm 364 364~490 14 68 20mm490~660 490~600 330~720 12 70 20mm660~950 9 73 20mm720 9 73 16mm牌坊式深度指示传动系统原理图理论计算:从传动的原理图分析可知:深度指示器丝杠的转数与提升机主轴的转数成正比;而主轴转数与提容器在井筒中的位置相对应。
以2米提升机更换齿轮选用表中的齿轮齿数进行验算:确定相关参数:1、根据主轴装置——主轴的轴径以及轴头的尺寸确定大伞齿轮的齿数:Z1=124;Z2=40或Z1=68;Z2=22,模数M=3以此为主轴到丝杠的第一传动比,i=Z1/Z2。
2、根据牌坊式深度指示器的齿轮更换表选取提升高度H=236 米;Z5=22; Z6=60 ; 丝杠螺母螺距t=20mm3、计算:(卷筒直径为2米;Z5、Z6按表选取)(1)提升机提升深度H=236米时主轴转动的圈数:N=H/(D×π)=37.5 (转)主轴到深度指示器丝杠的传动比:i=Z1/Z2×(Z5/Z6)=1.03;深度指示器指针的行程:S=t×n1=t×i×N=851.8 mm(2)提升机提升深度H=364米时主轴转动的圈数:N=H/(D×π)=57.96 (转)主轴到深度指示器丝杠的传动比:i=Z1/Z2×(Z5/Z6)=0.869;深度指示器指针的行程:S=t×n1=t×i×N=1074.9 mm(3)提升机提升深度H=490米时主轴转动的圈数:N=H/(D×π)=78 (转)主轴到深度指示器丝杠的传动比:i=Z1/Z2×(Z5/Z6)=0.63;深度指示器指针的行程:S=t×n1=t×i×N=993 mm(4)提升机提升深度H=660米时主轴转动的圈数:N=H/(D×π)=105 (转)主轴到深度指示器丝杠的传动比:i=Z1/Z2×(Z5/Z6)=0.53;深度指示器指针的行程:S=t×n1=t×i×N=1113.7 mm三、问题分析:通过以上计算,深度指示器的指针行程分别为851.8mm;1074.9mm、993mm和1113.7mm。
《C语言程序设计教程(第二版)》 第09章-指针(1)

访问p_int所 指向的变量
getch();
}
程序运行结果: num_int=12, *p_int=12 num_f=3.14, *p_f=3.14 num_ch=p, *p_ch=p
2019/2/22
11
1、指针变量的定义
指针变量的定义标识符
数据类型 *指针变量[,*指针变量2……];
例如, [案例9.1]中的语句:
int num_int=12, *p_int ;
特别说明:定义而未初始化的指针变量(例如 p_int)是悬空的。
使用悬空指针变量,很容易破坏系统,导致系统 瘫痪。
2019/2/22
12
2、取地址运算 : &变量名 例 如 , [ 案 例 9.1] 中 的 &num_int 、 &num_f 、 &num_ch 的结果,分别为对应变量的地址 (num_int 、 num_f、num_ch)。 注意:指针变量只能存放相同数据类型变量的 地址。 例如, [案例9.1]中的指针变量p_int、p_f、p_ch, 只能接收int型、float型、char型变量的地址,否则出 错。
使p_int指向变量num_int
2019/2/22
10
printf(“num_int=%d, *p_int=%d\n”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2f\n”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%c\n”, num_ch, *p_ch);
9.3* 1维数组的指针与列指针变量 9.4 字符串的指针和指向字符串的指针变量 9.5 指针数组与主函数main()的参数 9.6 返回指针值的函数
c语言 ●第10章 指针-1

…
19
2.定义时同时赋值
int a[10];
int *p=a; c规定: /* 相当于int *p=&a[0] */
若有 int a[10];
int *p=a; 则 p+1:指向下一个数组元素。
…
p+i:其指向下移i个元素。
20
说明:若有 int a[10]; int *p=a; (1) p+i *(p+i) = &a[i] a[i]= a+i *(a+i) (2)数组的指针变量也可带下标 a[i] ,p[i], *(a+i),*(p+i) 是等价的。 (3)a与p的区别:a代表数组a的首地址,是常量。 p=a; p也代表数组a的首地址,是变量。 如:p++; 是正确的,而 a++; 是错误的。 (4)引用数组元素有三种方法: 下标法: a[i]或p[i] 地址法:*(a+i) 效率低 指针法:*(p+i) *p++ 效率高
13
讨论: 若将被调函数swap( )改为: swap(int *p1,int *p2) {int *p; *p=*p1; *p1=*p2; *p2=*p; /*中间变量是指针变量所指的对象*/ } p无确定的地址(地址是随机的),可能指向任何单 元,有可能破坏系统(乱放枪)。加上int c;p=&c;就没 有问题了。
3 6 9 …
i j k
2004
3010
2000
i_pointer
3
二.对内存单位的访问 存数—写 取数—读 对内存单位的访问,是通过地址进行的。 如: printf(“%d”,i); 读 再如:scanf(“%d”,&i); 写 直接访问:按变量的地址直接读写变量的值。 如:k=i+j; (1)从2000开始的内存单元中取出i的值3. (2)从2002开始的内存单元中取出j的值6. (3)相加后,送入2004开始的内存单元。 间接访问:将变量a的地址存入另一变量b中,访问a时,先 找b,取出a的地址,再按此地址访问a。
指针1

*pa=&a[0]; *pa=a[0];这两种赋值方法是错误。
因为a是数组首地址是地址常量,不是变量。
陕 西 师 范 大 学 物 理 学 与 信 息 技 术 学 院 版 权 所 有
指针
• 算术运算
指针变量的运算
C程序设计
– 指针与整数的加减运算:p++; p--; p += k; p -= k; -- p; ++ p; • 指针 p 加上或减去 k ,其意义是指针当前指向位置的前方或后方第 k 个数据的地址。 • 这种运算的结果值取决于指针指向的数据类型。 – 指针加一,减一运算 指向下一个或前一个数据。 例如:y=*px++ 相当于 y=*(px++) (*和++优先级相同,自右向左 运算)
通过指针引用数组元素 经过上述定义及赋值后:
– pa pa+1 pa+i *pa *(pa+1) *(pa+i) &a[0], &(a[1]) &(a[i]) a[0] a[1] a[i]. – a[i], *(a+i) , *(pa+i) pa[i]都是等效的。 – 通过pa++,能 ? 但是不能写 a++,为什么?
陕 西 师 范 大 学 物 理 学 与 信 息 技 术 学 院 版 权 所 有
指针
C程序设计
指针变量作为函数参数
• 指针变量也可作为函数参数,其作用就是 通过函数传递,将变量的地址传到另一个 函数中去 • 指针变量函数参数可以实现在被调函数中 操作主调函数中的变量。 • 各式如下:行参是指针变量;实参可以是 变量的地址,或指针变量。
汇编语言理解指针(指针就是汇编的间接寻址,其实就是一个简单方便的运算指令,计算完毕直接就赋。。。

汇编语⾔理解指针(指针就是汇编的间接寻址,其实就是⼀个简单⽅便的运算指令,计算完毕直接就赋。
有空⾃⼰也写⼀个学习笔记,先把参考⽂章记下了:我的理解:指针就是使⽤mov⽅法的间接寻址。
想要明⽩指针,必须懂得LEA和MOV指令的区别。
然后就觉得已经豁然开朗。
mov 和 lea 的区别mov ecx,[eax+0x30]表⽰先运算eax+0x30得到⼀个结果,以这个结果为地址找⼀个ecx长度的内存数赋给ecxlea ecx,[eax+0x30]表⽰先运算eax+0x30得到⼀个结果,把这个结果(mov时地址)赋给ecx效果为ecx=eax+0x30 (这⾥eax参与了运算却没有改变值)dword 双字就是四个字节ptr pointer缩写即指针[]⾥的数据是⼀个地址值,这个地址指向⼀个双字型数据⽐如mov eax, dword ptr [12345678] 把内存地址12345678中的双字型(32位)数据赋给eax----------------------------------------------------MOV与LEA的区别可以说,mov 这个汇编指令在汇编语⾔程序中是⾮常⾮常常见的⼀个指令. 打个最简单的⽐⽅,就好⽐我们⼈要每天说话⼀样..在汇编语⾔中,Mov 指令就好⽐我们⼈要每天说话⼀样。
每⼀个程序都离不开 Mov指令。
Mov指令:传送指令,可以⽤于传送寄存器,也可以⽤于传送内存地址.lea指令:传送指令。
如果是刚刚学习汇编语⾔的朋友,看到上⾯的解释⼀定会很疑惑,Mov 和 Lea都是传送指令,那么它们直接的区别在哪⾥?下⾯详细解释 Mov 与Lea 汇编指令的区别.先作举⼀个⽣活中的例⼦, ⽐如你要坐车去电影院,你可以告诉司机电影院的地址,然后司机根据地址将你送到电影院. 你还可以,告诉司机电影院的名字,司机通过名字将你送到电影院. 我们⽤这两种⽅式都可以顺利的到达⾃⼰想到底的电影院.Mov 和lea 的作⽤就是像上⾯例⼦说的⼀样.⽤不同的⽅式(传送⽅式),达到同⼀个⽬的(传送数据).换句话说,Mov 指令传送⽅式,是将存放内存数据的地址进⾏传送. ⽽Lea则是恰恰相反,Lea是直接将内存数据进⾏传递.下⾯⽤⼀个例⼦说明 lea与mov 的区别:mov ecx,30add ecx,eax----------------------------------------------------lea ecx,[eax+30]----------------------------------------------------mov ecx,[eax+30]表⽰先运算eax+30得到⼀个结果,以这个结果为地址传递到⼀个ecx长度的内存地址存放ecxlea ecx,[eax+30]表⽰先运算eax+30得到⼀个结果,把这个结果传递到ecx中。
冀教版五年级数学下册第一单元《图形的运动》专项精选试卷 附答案

冀教版五年级数学下册第一单元图形的运动(二)一、填空。
(每空1分,共26分)1.寓意深远的汉字中蕴含着数学美,在“昌、日、比、台、正”这些汉字中,是轴对称图形的有()。
2.体育课上,老师口令是“立正,向左转”时,应按()时针方向旋转90°,口令是“立正,向后转”时,应按()时针方向旋转180°。
3.看图填一填。
(1)指针指向1,指针绕点O顺时针旋转30°后指向()。
(2)指针指向1,指针绕点O顺时针旋转()°后指向3。
(3)指针指向1,指针绕点O顺时针旋转90°后指向()。
(4)指针指向1,指针绕点O逆时针旋转()°后指向7。
4.如图,上面的图形怎样运动得到下面的图形?是平移的画“○”,是旋转的画“△”。
()()()()5.(1)图形△向上平移可以到达图形()的位置。
(2)图形△与图形()可构成一个轴对称图形。
(3)图形△绕点A顺时针旋转90°到达图形()的位置。
(4)图形△绕点()()时针旋转180°到达图形△的位置。
6.(1)图形A绕点O()时针旋转90°()次到达图形C的位置,图形D绕点O()时针旋转90°到达图形C的位置。
(2)图形D绕点O()时针旋转90°后,再向()平移()格得到图形E。
(3)以直线PQ为对称轴,直线左侧的图形B需要先向()平移()格,再向()平移()格,才能和图形E对称。
二、选择。
(将正确答案的序号填在括号里)(每小题2分,共14分)1.下面图形中只有一条对称轴的图形是()。
A. B. C. D.2.将绕点O按顺时针方向旋转90°,得到的图形是()。
A. B. C. D.3.把镜子分别放到下列每个选项右侧,从镜子中看到的是的是()。
A. B. C. D.4.下面左侧图形通过平移能得到()。
A. B. C. D.5.剪纸是我国传统的民间艺术。
如图△△,将一张纸片进行两次对折后,再沿图△中的虚线裁剪,最后将图△中的纸片打开铺平,所得图案应该是()。
理解C语言(一)数组、函数与指针

理解C语⾔(⼀)数组、函数与指针1 指针⼀般地,计算机内存的每个位置都由⼀个地址标识,在C语⾔中我们⽤指针表⽰内存地址。
指针变量的值实际上就是内存地址,⽽指针变量所指向的内容则是该内存地址存储的内容,这是通过解引⽤指针获得。
声明⼀个指针变量并不会⾃动分配任何内存。
在对指针进⾏间接访问前,指针必须初始化: 要么指向它现有的内存,要么给它分配动态内存。
对未初始化的指针变量执⾏解引⽤操作是⾮法的,⽽且这种错误常常难以检测,其结果往往是⼀个不相关的值被修改,并且这种错误很难调试,因⽽我们需要明确强调: 未初始化的指针是⽆效的,直到该指针赋值后,才可使⽤它。
int *a;*a=12; //只是声明了变量a,但从未对它初始化,因⽽我们没办法预测值12将存储在什么地⽅int *d=0; //这是可以的,0可以视作为零值int b=12;int *c=&b;另外C标准定义了NULL指针,它作为⼀个特殊的指针常量,表⽰不指向任何位置,因⽽对⼀个NULL指针进⾏解引⽤操作同样也是⾮法的。
因⽽在对指针进⾏解引⽤操作的所有情形前,如常规赋值、指针作为函数的参数,⾸先必须检查指针的合法性- ⾮NULL指针。
解引⽤NULL指针操作的后果因编译器⽽异,两个常见的后果分别是返回置0的值及终⽌程序。
总结下来,不论你的机器对解引⽤NULL指针这种⾏为作何反应,对所有的指针变量进⾏显式的初始化是种好做法。
如果知道指针被初始化为什么地址,就该把它初始化为该地址,否则初始化为NULL在所有指针解引⽤操作前都要对其进⾏合法性检查,判断是否为NULL指针,这是⼀种良好安全的编程风格1.1 指针运算基础在指针值上可以进⾏有限的算术运算和关系运算。
合法的运算具体包括以下⼏种: 指针与整数的加减(包括指针的⾃增和⾃减)、同类型指针间的⽐较、同类型的指针相减。
例如⼀个指针加上或减去⼀个整型值,⽐较两指针是否相等或不相等,但是这两种运算只有作⽤于同⼀个数组中才可以预测。
007-FCU1+2故障

FCU1+2故障一、参考文献:1、FCOM PRO-ABN-22;PRO-SUP-242、QRH ABN-80.18A (计算机重置)二、程序标准:无三、程序摘抄:PFD气压基准:仅有“标准”如果两个FCU(飞行控制组件)通道都故障时,在PFD上的气压基准值自动变为1013 hPa。
使用备用高度表来设置实际的气压值。
不要在MCDU PERF APPR(性能进近)页面上输入MDA(MDH)值(因为PFD高度是参考STD(标准)而不是修正的气压值)。
PNF必须用备用高度表执行标准口令(“决断高度加一百”和“决断高度”)。
另外: 所有FCU控制器不工作A/THR,AP1+2和FD1+2不可用。
(在LAND和GO AROUND方式中,只有A/THR失效)。
.在PFD上:• 高度警戒失效。
• ILS偏离刻度显示• 显示飞行航迹矢量。
• 马赫指示不工作。
• FMA失效,除了在LAND和GA方式中。
在ND上:• 带地图(80NM范围)的罗盘导航方式显示• VOR/ADF指针: 指针1只能指示VOR1。
指针2只与ADF2相关(若未安装ADF2,则为ADF1)。
(DDRMI(数字式距离和无线电磁指示器)上的VOR选择不受影响) (DDRMI上的ADF选择(若有)不受影响)。
• 气象雷达图象可能会丢失。
若仍然显示,则必须忽略。
在所有情况下,都显示 红色的“WXR RNG”(天气范围)信息----------------------------------------------------------------------------------------------------------------------------------------------------------------状态:PFD BARO REF :仅有“标准” ;如果在LAND或GA方式中: 仅2类不工作系统 :FCU 1 + 2 ;AP 1 + 2 ;A/THR; CAT 3;GPWS TERR ;CAT 2 (如果不在LAND 或 GA方式) ;四、补充讲解:AP1+2 失去 A/TH失去 FD1+2不工作PF PNF口令“我操纵,我通讯执行ECAM”取消master caution,master warning口令“你操纵,你通讯”执行ECAM动作”作到“STS”页,检查有无“检查单 OEB和计算机重置”执行完ECAM后,报告ECAM完成由于PFD气压基准只有STD,机组需要在高度上做修正,尤其是在修正气压与标准气压差异较大时。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指针一、指针概述1. 地址C++程序中每一个实体,如变量、数组和函数等,都要在内存中占有一个可标识的存储区域。
每一个存储区域由若干个字节组成,在内存中,每一个字节都有一个“地址”,一个存储区的“地址”指的是该存储区中第一个字节的地址。
2.指针指针就是存储区域的地址。
一个地址指向一个程序实体的存储空间。
直接访问:通过变量名或地址访问程序中一个实体的存储空间的方式(其实通过变量名访问也就是通过地址访问)。
间接访问:把一个变量的地址放在另一个变量中。
3.指针变量专门用来存放地址的变量就叫指针变量,需要专门加以定义。
二、指针的类型与指针的定义指针也是具有类型的。
指针的类型就是它所指向的变量的类型。
例如,一个指向int型的指针,一个指向一维数组的指针。
在使用一个指针变量之前,先要用声明语句对其进行定义。
例如:int *p;定义了一个指向整型数据的指针变量p。
即p是一个存放整型变量地址的变量。
应当特别注意的是,定义一个指针变量必须用符号“*”,它表示其后的变量为指针变量,指针变量为p,而不是*p。
要想使一个指针变量指向一个变量,必须将变量的地址赋给指针变量。
例如:int *p, i=3;p=&i;指针变量也可以定义为指向实型、字符型以及其它类型的变量。
如:float *p ;char *q ;三、指针运算符在C++语言中,有两个有关指针的运算符:&:为取地址运算符,&x的值为x的地址。
* :指针运算符,或称指向运算符,也称间接运算符,*p代表p 所指向的变量。
如:int a=15, *p;p=&a;cout<<a<<endl; 输出a的值15。
cout<<*p <<endl; 将指针变量p所指向的变量的值(15)输出。
*p=10; 将10赋给p所指向的变量。
Cout <<a<<endl; 输出a的值10。
注意:此处的*p与定义指针变量时用的*p含义是不同的。
在定义时,“int *p”中的“*”不是运算符,它只是表示其后面的变量是一个指针类型的变量。
而在程序中的执行语句中引用的“*p”,其中的“*”是一个指针运算符,*p表示“p指向的变量”。
因此,int i , *p ;p=&i ;则:*p和i 相同。
例: 交换两个指针变量所指向的变量的值。
Void main(){ int *p1 , *p2 , i , i1=10 , i2=20;p1=&i1,p2=&i2;i=*p1;*p1=*p2;*p2=i;cout<<i1<<””<<i2<<endl;}运行结果为:20 10四、指针与数组1.一维数组的指针表示方法一维数组名代表数组的起始地址。
假设一个数组int a[5],其起始地址为1010,则:a的值就为1010,a[0]的地址也为1010,a[1]的地址为1014,也可以用a+1表示,也就是说,“a+1指向数组a中下标为1的元素”。
同样,a+i是a[i]的地址。
需要说明的是:在编译系统计算实际地址时,a+i中的i要乘上数组元素所占的字节数,即:a+i×(一个元素所占的字节数)。
例如:a+1的实际地址为:1010+1×4=1014 ;a+3的实际地址为:1010+3×4=1022 ;余类推。
或者说,a+i和&a[i]是相等的,都是a[i]的地址。
请注意区分a[i]与&a[i]二者的不同含义。
为了引用数组中的一个元素,可以用下面三种不同的方法:(一)下标法:如a[3](二)地址法:通过地址a+3可以找到a[3]元素,*(a+3)就是a[3]。
因此下面二者等价:a[i]——下标法*(a+i) ——地址法都是指a数组中序号为i的元素值。
(三)定义一个指针变量,指向一数组元素。
例如:定义一个指针变量p,使它的值等于某一元素的地址,这样*p就是该元素的值。
int *p , i=10;p=&i ;例:分别用下标法、地址法和指针法访问数组元素。
Void main(){int a[5]={1,3,5,7,9}, *p , i ;for(i=0 ; i<5 ; i++)cout<<a[i]<<””; /* 用下标法a[i]输出*/cout<<endl;for(i=0 ; i<5 ; i++)cout<<*(a+i)<<””; /* 用地址法*(a+i)输出*/cout<<endl;for(p=a;p<a+5;p++)cout<<*p<<””; /* 用指针变量*p输出*/cout<<endl;}运行结果为:1 3 5 7 91 3 5 7 91 3 5 7 9现在着重分析第三种方法:用指针变量p指向数组元素的方法。
p的初值等于a,此时p指向a数组中第一个元素a[0],*p就是a[0]。
在输出*p的值后,p++使p指向下一个元素a[1],*p就是a[1],在输出*p的值后,p++又使p指向下一个元素,……,直到p=a+5为止。
由于p是变量,p的值不断在变化,而p的值是地址,因此p不断改变其指向。
五、指针与字符串字符串存放在字符数组中。
因此,对字符串操作可以定义一个字符数组,也可以定义一个字符指针。
例:用字符指针指向一个字符串。
Void main(){char string[ ]=“ C Language”;char *p;p=string;cout<<string<<endl;cout<<p<<endl;}运行结果:C LanguageC Language也可以不定义字符数组,而直接用一个指针变量指向一个字符串常量。
如:void main(){char *p=”C Language”;cout<<p<<endl;}程序中虽然没有定义数组,但字符串在内存中是以数组形式存放的。
它有一个起始地址,占一片连续的存储单元,并以“\0”结束。
char *p=”C Language”;的作用是:使指针变量P指向字符串的起始地址。
六、指针数组一个数组,如果每个元素的类型都是整型的,那么这个数组称为整型数组;如果每个元素都是同类型的指针类型,则它是指针数组。
也就是说,指针数组是用来存放一批地址的。
前已述及,在初始化字符数组时,可以用指针变量来代替字符数组。
例如:char *string=“I am a student”;如果有五个字符串,可以用五个指针变量来指向它,这就是指针数组。
例如:char *name[5]={“LiFang”, “ZhangLi”, “LingMaoTi”, “SunFei”,“Wangfang”}name是一维数组,它有五个元素,每个元素都是指向字符数据的指针型数据。
其中,name[0]指向第一个字符串“LiFang”。
七、指针与函数指针与函数的关系,主要表现在如下三个方面:1.用指针作为函数参数2.函数的返回值是指针3.指向函数的指针1.指针作为函数参数例:有一数组,有10个元素,要求输出其中最大和最小的元素。
#define N 10void main(){void max_min(int arr[ ],int *pt1,int *pt2,int n);int array[N]={1,8,10,2,-5,0,7,15,4,-5};int *p1,*p2,a,b;p1=&a;p2=&b;max_min(array , p1 , p2 , N);printf(“max=%d,min=%d\n”,a,b);}void max_min(int arr[ ],int *pt1,int *pt2,int n){int i;*pt1=*pt2=arr[0];for(i=0;i<N;i++){if(arr[i]>*pt1) *pt1=arr[i];if(arr[i]<*pt2) *pt2=arr[i];}}2.指向函数的指针一个函数包括一系列的指令,在内存中占据一片存储单元,它有一个起始地址,即函数的入口地址,通过这个地址,可以找到该函数,这个地址就称为函数的指针。
我们可以定义一个指针变量,使它的值等于函数的入口地址,那么通过这个指针变量,也能调用该函数,这个指针变量称为指向函数的指针变量。
定义一个指向函数的指针变量的一般形式:类型标识符(*指针变量名)( );例如int (*p)( );它表示p指向一个返回值为整型的函数。
注意,*p两边的括弧不能省略。
如果写成int *p( );就称了返回指针值的函数。
在定义了指向函数的指针变量后,可以将一个函数的入口地址赋给它,这就实现了使指针变量指向一个指定的函数。
如:p=fun1;可以用下列形式调用函数:(*指针变量)(实参列表);例如: (*p)(a,b);其相当于fun1(a,b);也可以写成p(a,b);例6.26 写一个程序,给出一个一维数组的元素值,先后四次调用一个函数,分别求①数组中元素之和②最大值③下标为奇数的元素之和④求各元素的平均值。
#define N 12main(){static float a[12]={1.5,3.8,5.6,7.8,91.6,1.61,13.3,15.0,17.5,19.9,21.7,23.0};float arr_add( ),odd_add( ),arr_ave( ),arr_max( );void process(float *p,int n,float (*fun)( ));int n=N;printf("the sum of %d elements is:",n);process(a,n,arr_add);printf("the sum of odd elements is:");process(a,n,odd_add);printf("the average of %d elements is:",n);process(a,n,arr_ave);printf("the maximum of %d elements is:",n);process(a,n,arr_max);}void process(float *p,int n,float (*fun)( )){float result;result=(*fun)(p,n);printf("%8.2f\n",result);}float arr_add(float arr[],int n) {int i;float sum=0;for(i=0;i<n;i++)sum=sum+arr[i];return(sum);}float odd_add(float *p,int n) {int i;float sum=0;for(i=0;i<n;i=i+2,p=p+2)sum=sum+*p;return(sum);}float arr_ave(float *p,int n) {int i;float sum=0,ave;for(i=0;i<n;i++)sum=sum+p[i];ave=sum/n;return(ave);}float arr_max(float arr[],int n) {int i;float max;max=arr[0];for(i=1;i<n;i++)if (arr[i]>max) max=arr[i];return(max);}4.返回指针的函数一个函数在调用之后可以带回一个值返回到主调函数,这个值可以是整型、实型、字符型等,也可以是一个指针类型。