栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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类型。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号