博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言——指向函数的指针
阅读量:6910 次
发布时间:2019-06-27

本文共 3377 字,大约阅读时间需要 11 分钟。

转载自:http://www.cnblogs.com/liangyan19910818/archive/2011/08/19/2145270.html

1 函数类型  (* 函数指针变量)() ;  //指向函数的入口地址

一个函数是若干语句的集合 , 经编译后存储在函数代码存储区 , 并占有一片连续的存储空间 ,对函数指针只能用函数名赋值而无其他运算

1 #include<stdio.h>

2
3 int max(int x ,int y);
4
5 int main()
6 {
7 int (* p)() ;//定义p是指向函数的指针变量
8 int a , b , c ;
9
10 p= max ;//将函数max的入口地址赋给指针变量p
11 scanf("%d %d" ,&a ,&b) ;
12 c= (* p)(a , b) ;//用指向函数的指针变量p调用函数
13 printf("a = %d , b = %d , max = %d" , a , b , c);
14
15 return0 ;
16 }
17
18 int max(int x ,int y)
19 {
20 int k ;
21 k= (x> y)? x : y ;
22
23 return k ;
24 }

函数名作为实际参数 :

1 #include 
2 3 int fun1(int a , int b) 4 { 5 return a+b ; 6 } 7 8 int fun2(int (*q)() , int x , int y) 9 {10 return (*q)(x , y) ;11 }12 13 int main()14 {15 int (*p)() , k ;16 p = fun1 ;17 k = fun2( p , 8 , 5 ) ;18 19 printf("k = %d \n" , k); //输出 1320 21 return0 ;22 }

设置一个函数proc ,每次调用它会实现不同的功能 ,输入 a , b 两个数 ,第一次调用proc时,找出两者中最大者 , 第二次找出最小者 , 第三次调用求两数之差 :

1 #include 
2 3 int max(int*x , int*y); 4 int min(int*x , int*y); 5 int a_b(int*x , int*y); 6 int proc(int*x , int*y , int(*p)()); 7 8 int main() 9 {10 int a , b ;11 12 printf("Enter a and b :");13 scanf("%d %d" , &a , &b);14 15 printf("a = %d \t b = %d \n" , a , b);16 17 printf("max(%d,%d) = " , a , b);18 proc(&a , &b , max);19 20 printf("min(%d,%d) = " , a , b);21 proc(&a , &b , min);22 23 printf("%d - %d = " , a , b);24 proc(&a , &b , a_b);25 26 return0 ;27 }28 29 int max(int*x , int*y)30 {31 int k ;32 33 k = (*x >*y) ?*x : *y ;34 35 return k ;36 }37 38 int min(int*x , int*y)39 {40 int k ;41 42 k = (*x <*y) ?*x : *y ;43 44 return k ;45 }46 47 int a_b(int*x , int*y)48 {49 int k ;50 51 k =*x -*y ;52 53 return k ;54 }55 56 int proc(int*x , int*y , int (*p)())57 {58 int q ; 59 q = (*p)(x , y);60 61 printf("%d\n" , q);62 63 return0 ;64 }

一个简单的主控菜单程序 , 包括 增加 , 删除 , 显示 , 退出

1 #include 
2 #include
//字符操作 3 #include
//包含system函数 4 5 void enter() ; 6 void delete() ; 7 void review() ; 8 void quit() ; 9 //void enter() , delete() , review() , quit() ;10 int menu();11 void (*option[])() = {enter , delete , review ,quit} ;12 13 14 int main()15 {16 int i ;17 while(1)18 {19 i = menu();20 system("CLS"); //清屏函数 21 22 (*option[i])(); //调用函数,执行功能 23 24 system("PAUSE"); //等待输入 25 system("CLS");26 }27 } 28 29 int menu()30 {31 char select[] = {
"1234EDRQedrq"};32 char*p , ch ; //定义数组指针应与数组数据类型一致 33 34 printf("1:Enter\n");35 printf("2:Delete\n");36 printf("3:Review\n");37 printf("4:Quit\n");38 39 printf("Please select a number :");40 41 while(!(p = strchr(select , ch = getchar()))) //将找到的字符地址赋给指针变量p42 // 若没找到则 p 返回 '\0' 即 NULL , 非P 为真 执行 下列语句 43 {44 putchar('\a'); // 产生响铃声 45 printf("%c\b" , ch); //退格回显 46 }47 48 return((p - select) %4) ; // 返回值只可能为 0 ,1 ,2 ,3 49 }50 51 void enter()52 {53 printf("In enter()");54 }55 56 void delete()57 {58 printf("In delete()");59 }60 61 void review()62 {63 printf("In review()");64 }65 66 void quit()67 {68 printf("In quit()");69 exit(0) ; //函数exit()使程序立即正常终止 , 通常 ,状态值 status 为 0 表示正常终止70 //status 为 非 0 时 为出现错误后终止程序 71 }

转载于:https://www.cnblogs.com/batteryhp/p/5020444.html

你可能感兴趣的文章
001作业题
查看>>
关于实习
查看>>
叠加等边三角形
查看>>
【对拍√】
查看>>
重载,继承,重写,多态的区别
查看>>
NUnit笔记
查看>>
maven添加sqlserver的jdbc驱动包
查看>>
POJ 1426 Find The Multiple
查看>>
WPF入门教程系列五——Window 介绍
查看>>
数字图像处理中所用数学工具4---集合、逻辑操作与模糊集合
查看>>
网页换肤
查看>>
[BZOJ3751/NOIP2014]解方程
查看>>
【Java例题】3.5 级数之和
查看>>
silverlight多国语言研究
查看>>
开发--省级三联动,简单的代码,但是功能不差
查看>>
赋值法
查看>>
单词积累(Unity)
查看>>
P4769 [NOI2018]冒泡排序(dp)
查看>>
[BZOJ5407]girls
查看>>
API接口 Http和Socket 优劣比较 使用场景选择
查看>>