【C语言】函数指针

首先看一段代码:

cpp 复制代码
#include <stdio.h>
 void test()
 {
 printf("hehe\n");
 }
 int main()
 {
 printf("%p\n", test);
 printf("%p\n", &test);
 return 0;
 }

输出的结果:

输出的是两个地址,这两个地址是 test 函数的地址。

那我们的函数的地址要想保存起来,怎么保存?

下面我们看代码:

cpp 复制代码
void test()
 {
 printf("hehe\n");
 }
 //下面pfun1和pfun2哪个有能力存放test函数的地址?
void (*pfun1)();
 void *pfun2();

首先,能给存储地址,就要求pfun1或者pfun2是指针,那哪个是指针?

答案是:

pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参 数,返回值类型为void。

练习:

cpp 复制代码
#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int (*pAdd)(int, int) = &Add;//pAdd存放Add函数的地址

	int ret = (*pAdd)(1, 2);
	printf("%d\n", ret);

	return 0;
}

探究&Add与Add:

cpp 复制代码
#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	printf("%p\n", &Add);
	printf("%p\n", Add);

	return 0;
}

经过查阅资料得知:&Add == Add。

与数组不同:int arr[]; &arr != arr 。

cpp 复制代码
#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int (*pAdd)(int, int) = Add;//也可以这样定义

	int ret1 = (*pAdd)(2, 3);
	printf("%d\n", ret1);

	int ret2 = pAdd(2, 3);
	printf("%d\n", ret2);

	int ret3 = (*****pAdd)(2, 3);
	printf("%d\n", ret3);

	return 0;
}

阅读两段有趣的代码:

cpp 复制代码
//代码1
 (*(void (*)())0)();
 //代码2
 void (*signal(int , void(*)(int)))(int);

代码2太复杂,如何简化:

cpp 复制代码
typedef void(*pfun_t)(int);
 pfun_t signal(int, pfun_t);
相关推荐
程序员zgh4 分钟前
C++ 互斥锁、读写锁、原子操作、条件变量
c语言·开发语言·jvm·c++
鲨莎分不晴15 分钟前
强化学习第五课 —— A2C & A3C:并行化是如何杀死经验回放
网络·算法·机器学习
喵了meme35 分钟前
C语言实战5
c语言·开发语言
搞科研的小刘选手1 小时前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议
拉姆哥的小屋1 小时前
从混沌到秩序:条件扩散模型在图像转换中的哲学与技术革命
人工智能·算法·机器学习
Sammyyyyy1 小时前
DeepSeek v3.2 正式发布,对标 GPT-5
开发语言·人工智能·gpt·算法·servbay
爱吃山竹的大肚肚2 小时前
EasyPOI 大数据导出
java·linux·windows
sin_hielo2 小时前
leetcode 2110
数据结构·算法·leetcode
Jay20021112 小时前
【机器学习】33 强化学习 - 连续状态空间(DQN算法)
人工智能·算法·机器学习
极地星光2 小时前
dmesg 工具的核心功能与作用
linux