C语言中函数指针和指针函数

函数指针

函数指针:首先它是一个指针,指向一个函数。
一般声明单个指针类型如下:

int *p;

p就是一个int类型的指针,它指向一个int类型变量的地址。
赋值:

int a = 0;
p = &a;

将a的地址给p,对p进行解引用,p就等于0,如果对p进行修改,同时也会改变a的值。

而函数指针就像整形指针一样,它指向一个函数的地址。
有一个函数声明如下:

int test()
{
	return 0;
}

如何要声明一个指针指向这个函数

int (*p)() = test;
或者
int (*p)() = &test;

&没必要写,因为函数名本身就代表了一个地址。
此时p就是一个指向test的指针
使用p:

int a = (*p)();
相当于
int a=test();

调用指针p,并将返回值赋值给a,=,但p后面的()不能忘记,如果有参数可以参数,没参数也不能省略。

指针函数

指针函数:简单来说就是一个函数的返回类型是指针,它的根本是一个函数。
声明一个返回值为int类型的指针:

int test()
{
	return 0;
}

如果返回类型是一个整形指针:

int *test(int *num)
{
	return num;
}

()的优先级高于*,所以test先跟()结合成为一个函数,剩下的int *就是函数的返回类型。

例题解析

有一个语句如下:

(*(void(*)()0))();

这是我在《C陷阱与缺陷》上面看到的一个例子,有兴趣的可以看看这本书。
第一眼看上去不知道这是个啥,对它简单的拆分来看:
使用x来代替void(*)()
就可以写成下面这种形式

(*((x)0))()

再使用y来代替(x)0

(*(y))()
(*y)()

此时(*y)()就非常容易理解
先看x代替的void(*)()
(*)是一个指针,指向一个void类型无返回值的函数,x本质是个指针
再看y代替的(x)0
将0强制类型转换成x类型,也就是将0转换成一个指向void类型的函数的指针。
最后看(*y)(),对y进行解引用,也就是调用y所指向的函数。

有下面语句

void (*signal(int))(int)

signal是一个函数,函数的参数为int类型,返回值是一个函数指针,调用该函数,这个函数的参数为int类型,返回值为void类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值