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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数指针指针函数C语言的两个重要概念,它们虽然涉及到指针函数的结合使用,但实际上表示了不同的含义和用法。 1. 函数指针(Function Pointer)是指可以指向函数指针变量。通过函数指针,我们可以在程序运行时动态地调用不同的函数函数指针的定义和用法如下所示: ```c // 定义函数指针 返回值类型 (*指针变量名)(参数列表); // 使用函数指针调用函数 指针变量名 = 函数名; 指针变量名(参数列表); ``` 例如,我们可以定义一个函数指针变量`p`,指向一个返回类型为`int`、参数列表为`int`的函数,并通过函数指针调用该函数: ```c int add(int a, int b) { return a + b; } int (*p)(int, int); // 定义函数指针变量 p = add; // 指向add函数 int result = p(3, 4); // 调用add函数,返回结果7 ``` 2. 指针函数是指返回指针类型的函数指针函数的定义和用法如下所示: ```c // 定义指针函数 返回值类型 *函数名(参数列表); // 使用指针函数返回指针 返回值类型 *p = 函数名(参数列表); ``` 例如,我们可以定义一个指针函数`getMax`,返回类型为`int*`,参数列表为两个`int`类型的数值,并返回较大的数值的指针: ```c int* getMax(int a, int b) { if (a > b) { return &a; } else { return &b; } } int a = 3, b = 4; int *p = getMax(a, b); // 返回较大的数值的指针 int result = *p; // 获取指针指向的数值,结果为4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值