首页 > 其他分享 >函数指针和指针函数

函数指针和指针函数

时间:2023-05-19 17:45:33浏览次数:32  
标签:函数 指向 int 返回值 函数指针 指针

目录
0、摘要

1、指针函数

2、函数指针

3、函数指针数组

4、将函数作为传参传入另一个函数

5、以下两个指针能分析清楚的话,那么 99% 的 C 语言指针问题都难不住你。

参考:

0、摘要
指针函数是返回指针的函数,函数指针是指向函数的指针。

int* FunctionReturnsPtr(int a); //返回值为指向int型的指针
将函数原型的函数名改为指针名,再在指针名前加星星,加括号,即可得指向该原型的函数指针。

想指向的函数原型: int FunctionA(double);
则指向该原型的函数指针PointerOfFunctionA定义为:int (*PtrrOfFunctionA)(double);
1、指针函数
返回指针的函数。

//定义一个返回值为“指向int型的指针”类型的函数
int* FunctionReturnsPtr(void) {
int* ptr = NULL;
return ptr;
}
2、函数指针
指向函数的指针。函数的外号。

常用于做回调函数,或者作为某平台的移植接口出现。

// 定义一个返回值为int型,传入参数为int型的函数。
int FunctionA(int a) {
printf("%d\n",a);
return 0;
}

// 定义一个返回值为int型,传入参数为int型的函数指针。
int (*PtrOfFunctionA)(int);

// 测试函数,通过该函数指针调用该函数
void TestPtrOfFunctionA(void) {
//将函数首地址赋值给函数指针的方法一
PtrOfFunctionA = FunctionA;
//将函数首地址赋值给函数指针的方法二
PtrOfFunctionA = &FunctionA;

(*PtrOfFunctionA)(1);//通过函数指针调用函数,此处等价于FunctionA(1);
PtrOfFunctionA(2); //在古老的编译器上不能这么用,此处等价于FunctionA(2);
FunctionA(3);
}
打个比方:使用函数指针相当于给同一个函数取外号。比如有个函数,名为A,我们又定义了指向这个跟A拥有同类型返回值、同类型传参的函数指针Ptr1、Ptr2、Ptr3,将A赋值给Ptr1、Ptr2、Ptr3,则此时,该函数就有了1个本名+3个外号,共4种喊法,无论用哪个名字或外号喊它/调用它,效果都是一样的。就是喊外号的时候外号前面要带个星星*。

3、函数指针数组
指向函数的指针的数组,即一堆指针。

// 定义一个返回值为int型,传入参数为int型的函数。
int FunctionOne(int a) {
printf("1 %d\n",a);
return 0;
}

// 定义一个返回值为int型,传入参数为int型的函数。
int FunctionTwo(int a) {
printf("2 %d\n",a);
return 0;
}

//定义一个返回值为int型,传入参数为int型,容量为2的函数指针数组。
int (*PtrOfFunctionXArray[2])(int) = {FunctionOne, FunctionTwo};

//测试函数,调用函数指针数组等价于调用原函数
void TestPtrOfFunctionArray(void){
(*PtrOfFunctionXArray[0])(1);
(*PtrOfFunctionXArray[1])(2);
}
4、将函数作为传参传入另一个函数
#include <iostream>
int add(int a, int b){
return a+b;
}
int sub(int a, int b){
return a-b;
}
void func(int e, int d, int(*f)(int a, int b)){
// 传入了一个int型,双参数,返回值为int的函数
std::cout<<f(e,d)<<std::endl;
}
int main()
{
func(2,3,add);
func(2,3,sub);

return 0;
}
5、​​​​​​​以下两个指针能分析清楚的话,那么 99% 的 C 语言指针问题都难不住你。
char *(* c[10])(int **p);
int (*(*(*pfunc)(int *))[5])(int *);
分析如下:

char *(* c[10])(int **p);

step1: (* c[10]):一个容量为10的指针数组,
step2: c的*的括号外面是(指向了)"char *()(int **p)"
step3: 即为函数指针,指向的函数原型为:char *Function(int **);
step4: 串起来:定义了一个容量为10的函数指针数组,指向的函数原型为char *Function(int **);
int (*(*(*pfunc)(int *))[5])(int *);

step1:
(*(*pfunc)(int *)):
pfunc是一个指针,pfunc的*的括号外面是(指向了)"*()(int*)",
即为函数指针,指向的函数原型为:?* Function(int*),
返回值为*,即指针,指针指向的数据类型未知

step2:
*(*(*pfunc)(int *))[5]:
返回值的*指向了"*()[5]",
说明返回值指向的数据类型为容量为5的指针数组,
该指针数组指向的数据类型未知

step3:
int (*(*(*pfunc)(int *))[5])(int *):指针数组的*的括号外面是"int ()(int *)",
即为函数指针数组,指向的函数原型为:int Function(int*)
串起来:
pfunc是一个函数指针,指向函数原型的传参为int*,
函数的返回值为指针,指向一个容量为5的指针数组,
指针数组种的指针的指向原型为int Function(int*)的函数,
参考:

深入浅出——理解c/c++函数指针 - 知乎 (zhihu.com)

函数指针及其定义和用法,C语言函数指针详解 (biancheng.net)

106 只需一招,彻底攻克C语言指针 - 开发者知识库 (itdaan.com)
————————————————
版权声明:本文为CSDN博主「childerxxx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/childerxxx/article/details/124631275

 

https://blog.csdn.net/childerxxx/article/details/124631275

 

标签:函数,指向,int,返回值,函数指针,指针
From: https://www.cnblogs.com/im18620660608/p/17415871.html

相关文章

  • 第十四篇——如何用通达信绘图函数画线?(从零起步编写通达信指标公式系列)
    内容提要:本文主要介绍了通达信指标公式常用绘图函数的第一种类型——画线函数,讲解了DRAWNULL、NODRAW、PLOYLINE、DRAWSL这四个画线函数的具体用法。 在上一篇文章中,给大家简单介绍了通达信指标公式绘图函数的三种类型,接下来将详细讲解这些函数的具体用法。说到绘图函数,就不......
  • hdu:gcd(欧拉函数)
    ProblemDescriptionThegreatestcommondivisorGCD(a,b)oftwopositiveintegersaandb,sometimeswritten(a,b),isthelargestdivisorcommontoaandb,Forexample,(1,2)=1,(12,18)=6.(a,b)canbeeasilyfoundbytheEuclideanalgorithm.NowCarpiscon......
  • Jmeter函数助手6-time
    time函数用于获取不同格式的当前时间(年月日时分秒)。FormatstringforSimpleDateFormat(optional):时间格式存储结果的变量名(可选) 1、不传参数默认生成的是当前时间毫秒时间戳时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数2、也可以传入我们想要的时间格式来......
  • 实验4 函数与异常处理编程
    实验任务1:实验源码:print(sum)sum=42print(sum)definc(n):sum=n+1print(sum)returnsumsum=inc(7)+inc(7)print(sum)实验运行截图:答:line1:内置函数line3:变量名line7:局部变量line11:全局变量 实验任务2:task2_1:实验源码:deffunc1(a......
  • JavaScript学习笔记: 函数
    概念在js中,函数与其他类型一样,是一个支持所有操作的值,是一个对象,是编程语言里的“一等公民”函数是一个代码块,每被调用一次,其代码就会执行一次。函数有一个被{}包裹的函数体,具体的逻辑代码就写在里面。使用return关键字返回函数的计算结果,如果没有返回值,那函数调用表达式的值......
  • js 使用 eval 函数优化条件查询
    我们在写代码的使用,经常会遇到ifelse很长很长的代码,这种要怎么优化,一直是仁者见仁智者见智的我说下我的优化方案原始代码例如:if(income<=10000){ returnincome*0.365;}elseif(income<=30000){ return(income-10000)*0.2+35600;}elseif(income<=60000)......
  • Jmeter函数助手6-timeShift
    timeShift获取移动时间变化之后的指定格式时间FormatstringforDateTimeFormatter(optional)(defaultunixtimestampinmillisecond):可以传入我们想要的时间格式来获取当前时间YYYY-MM-ddHH:mm:ss转换时间:默认现在Amountofseconds/minutes/hours/daystoadd(e.g.......
  • 函数递归调用
    defsumm(x):ifx==1:return1#x值为1时,return1跳出递归调用递归调用出口else:returnx+summ(x-1)#递归调用自己调用自己print(summ(100))#print(summ(1000))#Previouslinerepeated986moretimes超出最大递归深度......
  • VsCode 自动生成文件头部注释和函数注释
    1,安装插件KoroFileHeader2,配置头部注释和函数注释在vscode左下角点击设置按钮,选择“设置”,然后输入“fileheader”,{"editor.formatOnSave":true,"editor.formatOnType":true,"git.confirmSync":false,"git.autofetch":true,//文件头部注释......
  • Vue生命周期钩子函数
    每个Vue实例创建时,都会经历一系列的初始化过程,同时也会调用相应的生命周期钩子,我们利用这些钩子,可以在合适的时机执行我们的业务逻辑。vue生命周期共分为四个阶段,八个基本钩子函数<script>exportdefault{data(){return{filter:"all",};},beforeCre......