一、用函数指针变量调用函数

一个函数,在编译的时候 ,系统会给这个函数分配一个入口地址,这个入口地址就称为函数的指针(地址)。既然有地址,那么我们可以定义一个指针变量指向该函数,然后,我们就可以通过该指针变量调用该函数了。

每个函数在可执行文件时都会占用一段内存单元,它们有一个起始地址。既然有地址,就可以用一个指针变量指向一个函数,从而通过指针变量来调用它所指向的函数。、

#include<stdio.h>
int max(int x,int y)  //函数本身会占用一段内存单元
{if(x>y)return x;return y;
}
int main()
{int c;//c=max(5,19);int (*p)(int x,int y);  //定义一个函数指针变量;不可以写成 int *p(int x,int y); 这就是函数声明了;//这里int *就表示这个函数的返回值是指向整型变量的指针。//*p两侧的括号()不可以省略,有()表示*和p先结合代表一个指针变量,然后再和后边的()结                                                          合表示此指针变量指向函数。//int (*p)(int x,int y);可以写成 int (*p)(int,int);p=max;  //将函数max的入口地址赋给指针变量p,函数名代表函数的入口地址//现在p就是指向函数max的指针变量,p和max都指向函数的开头。//p=&max;这样写也可以,所以 p=max; 和 p=&max;  是等价的。c=(*p)(5,19);  //调用*p就是调用函数max,p指向函数max的入口,等价于c=max(5,19);//这里的调用只是用*p取代了函数名//p不能指向函数中间的某条语句,所以*(p+1)不合法//其实在函数调用的时候,* 可以省略的;所以在这里 c=(*p)(5,19); 和 c=p(5,19); 等价。printf("c=%d\n",c);printf("max=%p\n",max);printf("p=%p\n",p);   //发现 p 和 max 的地址相同
}

总结:

a) 函数指针变量定义的一般形式:

数据类型标识符 (*指针变量名) (形参列表)

其中,“数据类型标识符” 就是指函数的返回值类型,“形参列表” 里可以只有类型说明符(*p)(int,int),多个类型说明符之间用逗号分隔。

我们可以通过函数指针指向不同的函数 来达到调用不同函数的目的;这个是有实际用途的。

b) 函数的调用,可以通过函数名,也可以通过函数指针调用。

c) 对指向函数的指针变量 p ,做一些像 p++,p--,p+n 等运算都不可以,也没有意义。

二、把指向函数的指针变量作为函数参数

指向函数的指针变量也可以作为 另一个函数FuncB的参数,从而实现函数地址的传递,也就是FuncB函数中调用该函数指针变量所指向的函数的目的。

发现:在另一个函数中也可以直接调用另一个函数,但是把另一个函数作为函数参数调用,增加了函数的灵活性。

#include<stdio.h>//函数一
int max(int x,int y)  //函数本身会占用一段内存单元
{    if(x>y)        return x;    return y;}//函数二用函数一作为函数参数
int wwmax(int x,int y,int (*midfunc)(int x,int y))//形参
int (*midfunc)(int x,int y)就是一个函数指针
{    int result =midfunc(x,y); //调用 函数指针 midfunc 所指向的函数
return result;
}
int main()
{    int c;    c=wwmax(5,19,max);
printf("c=%d\n",c); //结果是19
int (*p)(int,int);  //定义一个局部的函数指针变量  p=max;    c=wwmax(45,21,p);    printf("c=%d\n",c); //结果是45    return 0;}

三、返回指针值的函数

函数中也可以返回指针型数据。也就是地址。

返回指针值的函数的一般定义形式:

数据类型 *函数名 (int x,int y);

int *a(int x,int y);     //a是函数名,()的优先级高于 * ,因此a先和(int x,int y)结合

#include<stdio.h>
int sum;   //定义一个全局变量,生存周期一直到程序结束,这个变量占用的内存一直存在,能够被我控制,不会被系统回收。
int *add(int x,int y)
{sum=x+y;return &sum;  //隐藏一个致命问题,add函数调用完毕后,sum的内存就会被系统回收。绝不可以把sum的内存地址返回到被调用函数中并加以使用。
}int main()
{int *persult;persult = add(4,5);  //执行这个add后,persult指向的内存已经不归你所有,你不应该从中取得值或者给它赋值。printf("persult=%d\n",*persult);return 0;
}

C语言函数指针和返回指针值的函数相关推荐

  1. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换

    pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换 目录

  2. (转)函数指针,指针函数,指向函数的指针,返回指针的函数

    摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...

  3. 细说PHP笔记03(第7章)--数组与数据结构,数组定义,数组遍历,数组内部指针遍历,键值操作函数,统计数组函数,回调函数处理数组元素,数组排序,拆分、合并、分解、结合数组,数组实现堆栈,随机选取元素

    1.数组 索引数组:索引值是整数 关联数组:索引值是字符串 2.数组的定义 1.以直接赋值的方式声明 $数组名[下标]=资料内容 或 $数组名[关联字符串(键值)]=资料内容 <?php $va ...

  4. python内置函数用来返回_Python内置函数

    1.abs() 函数返回数字的绝对值. 2.all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否不为 0.''.False 或者 iterable 为空,如果是返回 True, ...

  5. python内置函数用来返回_python内置函数2

    37.locals() 函数会以字典类型返回当前位置的全部局部变量 locals() >>>def runoob(arg): # 两个局部变量:arg.z ... z = 1 ... ...

  6. Mysql的IF()函数:如果返回True值,返回第一个值,为False值,返回第二个值

    IF函数定义 语法 IF(condition, A, B) 如果condition为TRUE值,就返回A,如果condition为FALSE值,就返回B. 举例 添加表 create table te ...

  7. python内置函数用来返回_Python内置函数用法

    1.Python raw_input()函数 作用: raw_input() 用来获取控制台的输入,将所有输入作为字符串看待,返回字符串类型. 注意: input() 和 raw_input() 这两 ...

  8. 【C语言学习笔记】26. 指针(3)指向指针的指针、传递指针给函数

    前言 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.通常,一个指针包含一个变量的地址.当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置. ...

  9. c语言函数名本质是指针,C语言的本质(12)——指针与函数

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...

最新文章

  1. 如何在Matlab中获取函数参数的数目?
  2. Nginx热部署详解
  3. 【线性表4】线性表的链式实现:静态表
  4. vtbl 什么时候被改写
  5. SAP云平台和SAP传统Netweaver系统互联的技术方式
  6. 得意而忘乎形:谈葛水平的水墨画
  7. java 调用wget_通过命令行执行WGET下载会更快,而通过Java代码执行时会更慢
  8. jquery的smartWizard插件使用方法
  9. WinRAR5.60 64位 官方无广告正式版注册破解
  10. android webview 下载图片,Android使用webView长按保存下载网络图片
  11. html叫编程语言吗,html是编程语言吗
  12. Python图像处理(Pillow/PIL)入门
  13. 用C语言实现布丰投针计算圆周率问题
  14. 如何选择最合适的服务器?服务器配置方案
  15. Tableau:与Python集成
  16. 在vue中_this和this的区别
  17. 项目经理的知识和技能,学会这些你就是合格的PM
  18. VMware安装WinXP蓝屏及激活
  19. lstm 变长序列_基于变长时间间隔LSTM方法的胎儿异常体重预测
  20. DIY搭建黑群晖(XPEnology)备忘记载

热门文章

  1. DUET and updated DUET(2016 and 2019)
  2. jquery自带的赋值函数html
  3. Voronoi图(四):抛物线的妙用
  4. 头歌答案--编写一个能搜索单词的程序Bailey–Borwein–Plouffe公式
  5. 中文版GPT3——CPM(2.6B)微调长短文本生成(对应小说歌词)
  6. 统计学总结之Bias(偏差),Error(误差),和Variance(方差)的区别
  7. cf Educational Codeforces Round 134 E. Prefix Function Queries
  8. 统计学基本知识(四)
  9. 西安电子科大版《计算机操作系统》第四版共读——第十一章 多媒体操作系统
  10. 用Python编写代码来理解赢得《英雄联盟》游戏的胜利的最重要因素