【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);
相关推荐
我码玄黄36 分钟前
正则表达式优化之算法和效率优化
前端·javascript·算法·正则表达式
soragui1 小时前
【Ubuntu】如何轻松设置80和443端口的防火墙
linux·运维·ubuntu
Amd7941 小时前
在不同操作系统上安装 PostgreSQL
linux·windows·macos·postgresql·操作系统·数据库管理·安装指南
Solitudefire1 小时前
蓝桥杯刷题——day9
算法·蓝桥杯
Tony11541 小时前
VMwareWorkstation虚拟机安装Rocky8.10系统详细教程
linux·虚拟机
march of Time2 小时前
centos系统如何安装kubectl和部署kube-apiserver
linux·运维·centos
wkd_0072 小时前
【开源库 | xlsxio】C/C++读写.xlsx文件,xlsxio 在 Linux(Ubuntu18.04)的编译、交叉编译
c语言·c++·xlsxio·c语言读写xlsx·c++读写xlsx·xlsxio交叉编译
三万棵雪松2 小时前
1.系统学习-线性回归
算法·机器学习·回归·线性回归·监督学习
Easy数模2 小时前
基于LR/GNB/SVM/KNN/DT算法的鸢尾花分类和K-Means算法的聚类分析
算法·机器学习·支持向量机·分类·聚类
Ocean☾3 小时前
C语言-基因序列转换独热码(one-hot code)
c语言·开发语言