时间:2021-05-02
一、定义函数指针
? 1 return_type (*func_pointer)(parameter_list)普通指针变量的定义
? 1 2 int * p; char * pointer; 类型的限定都在变量前面;
函数指针类型的限定是前后都有,前面是返回类型,后面是输入参数。
利用typedef 可以简化上面的表达方式。
? 1 2 typedef return_type (*FunctionPointer) (parameter_list); FunctionPointer func_pointer;这样是不是容易读了,和上面的功能一样,定义了一个返回类型为return_type ,输入参数为parameter_list的函数指针。
二、定义返回函数指针的函数
return_type(*function(func_parameter_list))(parameter_list)
方框圈出来的表示返回类型为函数指针,剩下的部分就表示一个function函数,输入参数为func_parameter_list。
它就等价于 FunctionPointer function(func_parameter_list); 。
再看看:
signal是一个返回函数指针的函数,signal的输入为int 变量和一个函数指针。
三、函数指针的使用
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int add(int a, int b); void main() { int(*fun1)(int a, int b) = add; int(*fun2)(int a, int b) = &add; int(*fun3)(int a, int b) = *add; printf("%d\n", fun1(1, 2)); printf("%d\n", fun2(1, 2)); printf("%d\n", fun3(1, 2)); char input[10]; gets(input); } int add(int a, int b) { return a + b; }函数名会被隐式的转变为指针,前面加*和&操作符都不起作用,printf的结果都是3。
四、神奇的代码
? 1 2 int (*(*pf())())() { return nullptr; }哇哦,这是个什么函数!画个框框分解它
小框表示返回的是一个函数指针,在圈个大框,又是一个函数指针。
它就表示,pf() 返回的是一个函数指针,这个函数指针对应一个无输入参数的函数:返回值也是函数指针(对应无输入参数的函数,返回值为int类型)。好复杂啊,有点晕!
利用typedef 简化一下。
这样看就舒服多了。
五、这又是什么鬼!
? 1 (*(void(*) ())0)();画个框看看:
小框里代表一个函数指针,常数前面加括号代表类型的强制转换。咦,它把0强制转换成了一个函数指针,并执行!这是什么操作啊!
六、一段验证代码
函数名前面加不加*,&操作符,都是一个效果;函数指针前面加不加*操作符是一个效果,但是加上&操作符就代表着取指针的地址了。
可以通过typedef int Function(int, int); 为一种类型的函数定义别名,但是使用的时候只能定义指针形式的变量:
七、一个问题
在stackoverflow上偶尔看到如下的问题,代码如下
执行结果是无论hello前面有多少个指针符号,都是执行hello()函数,打印“hello”。
为什么出现这样的结果呢:
用指针指向一个函数是OK的,但是仍然还要被转化为一个function pointer。其实使用*来指向一个函数 == CALL这个函数。因此无论指向多少次,仍然也是调用这个函数。
为什么一个函数会被转化成一个指针呢?答案就是将函数默认的转换成函数指针,可以减少&的使用,编译器默认的将函数转化为函数指针,也省得你每次调用函数时加*调用函数。
哈哈,也就是我们之前说的,函数即指针。似乎有点不是很清晰,再看下面的例子
上面的列子不出例外,都能正常打印我们想要的数据。
但是对于&,则要进行仔细的分析一下:
&对于一个函数的操作,是返回一个指针,指向函数的指针,如果在对此指针执行&也就是&&foo,则会返回error,因为&foo是一个指针数值,也就是一个rvalue类型,再对他进行&操作,显然是返回error的。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C语言中值传递和指针传递实例详解在C语言中,函数的参数和返回值的传递方式有两种:值传递和指针传递。值传递和指针传递初学者总会有一种朦胧的感觉,所以建议把指针传递
php的引用(就是在变量或者函数、对象等前面加上&符号),在PHP中引用的意思是:不同的名字访问同一个变量内容。与C语言中的指针是有差别的.C语言中的指针里面存
新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处。下面我就带着问题来写下我对于指针的一些理解。指针是什么?指针本
在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以
Block概述Block它是C语言级别和运行时方面的一个特征。Block封装了一段代码逻辑,也用{}括起,和标准C语言中的函数/函数指针很相似,此外就是blok