博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针函数与函数指针
阅读量:4455 次
发布时间:2019-06-07

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

 

 

一、指针函数

  指针函数,是指带指针的函数,即本质是一个函数。函数都有返回类型(如果不返回值,则为无值型void),只不过指针函数返回类型是某一类型的指针。函数返回值必须用同类型的指针变量来接受,而且,在主调函数中,函数返回值必须赋给同类型的指针变量

  定义格式:

  类型名 *函数名(函数参数列表);

  其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。

  “(函数参数列表)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略

  下面看指针函数的实现:

1 /* 2 * 求最大值 3 * 返回值是int类型,返回两个整数中较大的一个 4 */ 5 #include 
6 #include
7 using namespace std; 8 int *f(int a, int b); // 声明指针函数 9 10 int _tmain(int argc, _TCHAR* argv[]) 11 { 12 printf("------------------------------ Start\n"); 13 14 int *p1 = NULL; 15 printf("The memeory address of p1 = 0x%x \n", p1); 16 17 p1 = f(1, 2); 18 19 printf("The memeory address of p1 = 0x%x \n", p1); 20 printf("*p1 = %d \n", *p1); 21 22 printf("------------------------------ End\n"); 23 getchar(); 24 return 0; 25 } 26 27 /* 28 * 指针函数的定义 29 * 返回值是指针类型int * 30 */ 31 int *f(int a, int b) { 32 int *p = (int *)malloc(sizeof(int)); 33 printf("The memeory address of p = 0x%x \n", p); 34 memset(p, 0, sizeof(int)); 35 *p = a + b; 36 printf("*p = %d \n", *p); 37 38 return p; 39 }

  运行结果:

  

  通过运行结果,可以看出,指针函数f返回的类型是一个指针类型,因为f是赋值给int类型指针p1的,如果不是指针类型,编译就会出错。

 

二、函数指针

  函数指针是指向函数的指针变量。因而“函数指针”本身首先应该是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整形变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数

  函数指针的声明格式如下

  返回值类型 ( * 指针变量名) ([形参列表]);

  注:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表

  例如:

1 void (*fptr)();//指针名为fptr,指向一个返回值类型为空,不带参数的函数

  把函数的地址赋值给函数指针,可以采用下面两种形式:

1 fptr=&Function;2 fptr=Function;    //取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址

 

  如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数:

1 x=(*fptr)();2 x=fptr();

  第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。

 

  下面来看例子,首先是用函数指针来调用函数:

1 /* 2 * 求最大值 3 * 返回值是int类型,返回两个整数中较大的一个 4 */ 5 #include 
6 #include
7 using namespace std; 8 int max(int a, int b) { 9 return a > b ? a : b;10 }11 12 /*13 * 求最小值14 * 返回值是int类型,返回两个整数中较小的一个15 */16 int min(int a, int b) {17 return a < b ? a : b;18 }19 20 int(*f)(int, int); // 声明函数指针,指向返回值类型为int,有两个参数类型都是int的函数 21 22 int _tmain(int argc, _TCHAR* argv[])23 {24 printf("------------------------------ Start\n");25 26 f = max; // 函数指针f指向求最大值的函数max 27 int c = (*f)(1, 2);28 29 printf("The max value is %d \n", c);30 31 f = min; // 函数指针f指向求最小值的函数min 32 c = (*f)(1, 2);33 34 printf("The min value is %d \n", c);35 36 printf("------------------------------ End\n");37 getchar();38 return 0;39 }

 

  运行结果:

  

 

  下面是用函数指针作为函数参数的例子:

1 #include 
2 using namespace std; 3 void MyFun1(int x); 4 void MyFun2(int x); 5 void MyFun3(int x); 6 typedef void(*FunType)(int); //定义一个函数指针类型FunType 7 void CallMyFun(FunType fp, int x); 8 9 int main(int argc, char* argv[])10 {11 CallMyFun(MyFun1, 10); //通过CallMyFun函数分别调用三个不同的函数12 CallMyFun(MyFun2, 20);13 CallMyFun(MyFun3, 30);14 //当然,这样调用也阔以15 printf("---------cut-line-----------\n");16 CallMyFun(&MyFun1, 10);17 CallMyFun(&MyFun2, 20);18 CallMyFun(&MyFun3, 30);19 20 }21 void CallMyFun(FunType fp, int x) //参数fp的类型是FunType。22 {23 fp(x);//通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的24 }25 void MyFun1(int x) //这是个有一个参数的函数,以下两个函数也相同26 {27 printf("函数MyFun1中输出:%d\n", x);28 }29 void MyFun2(int x)30 {31 printf("函数MyFun2中输出:%d\n", x);32 }33 void MyFun3(int x)34 {35 printf("函数MyFun3中输出:%d\n", x);36 }

 

  运行结果:

  

  

转载于:https://www.cnblogs.com/codingmengmeng/p/5881101.html

你可能感兴趣的文章
Python 教程阅读笔记(一):使用解释器
查看>>
运算符重载
查看>>
SDWebImage 新版接口使用方法
查看>>
DataTable导出为word,excel,html,csv,pdf,.txt
查看>>
android ListView详解
查看>>
软件工程 第一次作业
查看>>
Content Server HA搭建
查看>>
vue-textarea 自适应高度
查看>>
(2)数据结构——线性表(链表)实现
查看>>
[leetCode]Linked List Cycle I+II
查看>>
leetcode中的python学习
查看>>
sqlserver打开对象资源管理器管理的帮助文档的快捷键
查看>>
JBOSSAS 5.x/6.x 反序列化命令执行漏洞(CVE-2017-12149)
查看>>
Zookeeper zkui-zookeeper图形化管理工具
查看>>
java运行时内存分类
查看>>
为什么说 Git 比 SVN 更好
查看>>
1.基础数据类型的初识 字符串 bool 整型 if else elif
查看>>
【设计模式】4、原型模式
查看>>
进入meta模式关闭背光灯
查看>>
webstorm上svn的安装使用
查看>>