700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【C语言】函数指针(指向函数的指针)

【C语言】函数指针(指向函数的指针)

时间:2019-09-09 00:49:47

相关推荐

【C语言】函数指针(指向函数的指针)

文章目录

1. 函数指针的定义2. 函数指针的定义形式2.1 一般定义方法2.2 加上typedef关键字的定义3.利用函数指针调用其所指向的函数3.1 情况1:一般调用3.2 情况2:函数指针做为结构体成员

1. 函数指针的定义

一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。

我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,即指针指向该函数的内存首地址,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。

这种指针就是函数指针

p=函数名;//p为指针变量

2. 函数指针的定义形式

2.1 一般定义方法

returnType (*pointerName)(param list);

returnType 为函数返回值类型,pointerNmae 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。

注意( )的优先级高于*,第一个括号不能省略,如果写作returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为returnType *。

例:

void (*irq_func)(void);

定义了一个函数指针irq_func,指向的函数接收一个整形参数且无返回值。

2.2 加上typedef关键字的定义

typedef void (*irq_func)(void);

加上typedef关键字后,irq_func就不再是一个单一的函数指针了,而是一种数据类型,是指向“无形参且无返回值”这种类型函数的函数指针类型。

我们可以利用irq_func去定义具体的函数指针。

例如:

void test(void){printf("hello world!\n");}typedef void (*irq_func)(void);irq_func p_test_1=test;//定义一个指向函数test的函数指针p_test_1。irq_func p_test_2=&test;//函数指针指向函数地址时候,可以加取地址符号&,也可以不加,效果等同。

注意:函数指针指向函数地址时候,可以加取地址符号&,也可以不加,效果等同。函数名是一个地址,可以将他赋值给一个指向函数的指针。前面加了&符号其意义是一样的。这些都是设计语言时这样规定的。

记住:只要加上typedef,就是定义了一种新的数据类型,或为已存在的数据类型进行重命名。这里属于第一种。

3.利用函数指针调用其所指向的函数

3.1 情况1:一般调用

int test(void){return 6;}typedef int (*irq_func)(void);irq_func p_test_1=test;

问:当我们向使用函数指针p_test_1来调用函数test时,下列哪种方法是正确的?

第1种写法:

int i;i=p_test_1();

第2种写法:

int j;j=(*p_test_1)();

答:以上两种写法都可以。最终效果一致,变量 i 和 j 的值均为6.

3.2 情况2:函数指针做为结构体成员

当函数指针是一个结构体变量的成员时,此时怎么正确调用此函数指针所指向的函数?

问:此时下面三个调用函数的写法哪个正确?

#include "stdio.h"int test(void){return 5;} typedef struct haha{int (*p_test)(void);}haha,*p_haha;haha cw={.p_test=test,};p_haha p_cw=&cw;int main(void){int i,j,k;/*写法1*/i=cw.p_test();printf("i =%d\n",i);/*写法2*/j=cw.(*p_test)();printf("j =%d\n",j);/*写法3*/k=(*(cw.p_test))();printf("k =%d\n",k);}

答:写法1,3正确。写法2错误。

C语言中,‘.’运算符的优先级很高,比 * 高。

第二种写法是在找cw的(*p_test)成员,这里显然是没有的,改成:(*(cw.p_test))()就没有问题,指向函数的指针说白了也就是一个特殊的变量而已。需要首先要通过’.'运算符获取到这个成员变量,才能使用这个变量。cw.p_test是获取变量的过程,不可以拆开的。

如果用结构体指针p_cw来调用test函数,则正确写法是(*(p_cw->p_test))()

(这里需要特别感谢CSDN的“Frankenstein_Quasimo”的解疑回答!)

参考资料:/zhangzhi123456789/article/details/49253171

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。