函数指针是什么

#define _CRT_SECURE_NO_WARNINGS 1

//函数指针
//函数指针重点是指针,说明函数指针也是指针,只是一种指向了函数的指针。

//#include <stdio.h>
//void test()
//{
//    printf("hehe\n");
//}
//int main()
//{
//    printf("%p\n", test);
//    printf("%p\n", &test);
//    return 0;
//}

// 打印上面代码你就会发现,&test和test是一样的数值,所以test = &test;(不严谨,只是为了方便理解)
// 函数也是有地址的,为了存放函数的地址我们也要用指针来接收,这种指针就是函数指针:
// 比如:     void (*p)(int ,int ) 就是一种函数指针;
//     为什么*P 要加括号? 因为:*P如果不加括号,那么p就要先与(int, int)结合之后 才与*号结合;
//                             如果p 先与(int, int)结合 p 就变成一个函数名了,而不是指针名;

//     void:           void是函数的返回类型;
//   (int, int):        (int, int)是函数的参数;

// 解析 void (*p)(int ,int ) 这个表达式:
//        1. 因为括号的存在 P 先与* 结合;所以p 是一个指针的名字;
//        2.在把(*P)蒙住不看,剩下:void (int, int);
//        3.说明 p 这个指针 指向了一个 参数是int 类型,返回值是 void类型的函数;

// 如果你要将一个函数的地址用指针来接收的话你可以这样写;
// 1.将一个函数的地址拿出来:    取地址函数名———— &test;
// 2.将此地址给指针:   void (*p)(int ,int ) = &test;
// 3.通过上面18行的解释我们可以得到:      void (*p)(int ,int ) = test;(可以去掉 & );

// 使用这个指针;
// 在以前的学习我们可以知道如果要使用一个指针所指向的内容 我们要对其解引用:*p
// *p (实参): 比如:*P(3, 5)
// 但是:因为你之前将得出:                 test = & test 
//                         &test 是一个地址呀! 而 p 是个指针,p 里面存的就是test的地址呀!
//          那就可以这样写:    test(3 ,4)  == p (3, 4);
//                                                        直接就把指针当函数名用了
//         所以以后我们可以不用对其进行解引用了,直接 p (实参);
// 
// 
// 注:此为作者初学时的理解,请您指正;   
//   




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值