typedef和函数指针怎么用,用在哪些地方--补全你的只是盲区

9 篇文章 0 订阅

1.typedef

简单来说就是给类型取别名,你到公司工作会看到各种不同类型的数据类型,其实只是他们自己取的别名罢了。

	unsigned long int a;
	//1 不想让别人知道我的类型
	//2 嫌这个名字太长了
	//给类型取个别名
	typedef unsigned long int NLINT;
	typedef unsigned long int  MHT_INT64;
	typedef unsigned long int  QF_INT64;
	//NLINT   MHT_INT64  QF_INT64 都是指向 unsigned long int的替代名字,作用一模一样。

2 函数指针

2.1 函数指针的定义

是一种指针变量,所以储存的是一个函数的地址,函数也是有地址的,函数产生之后储存在内存的代码区,内存分有:栈区,堆区,静态区,代码区。函数的地址就是函数名。
在这里插入图片描述

void fun()
{}
int main()
{
	printf("%p",fun);//函数名就是地址
}

给函数指针取别名,使用typedef

void fun(int a){}
int main()
{
	typedef void name(int a);
	name *p=fun;//前面已经说过函数名就是地址,所以p是void (int a)类型的指针变量,保存fun(int a的地址)。
	typedef void*name)(int a);//name要加括号,不加括号就是函数指针数组了,里面储存的是多个函数的地址.
	name q=fun;//q是一个void *(int a)的指针变量
}

2.2函数指针取值

void fun(int a){}
typedef  void (*FUN)(int a );
//q为保存fun(int a)函数的地址,大家想想fun是函数地址,那么fun(10),就能调用函数了,同理q(10)也能调用函数。
FUN q=fun;
//注意
(*p)(20);//对函数指针取* 编译器认为还是函数的地址
(&fun)(10);//对函数名取&编译器认为还是函数的地址
(*fun)(10);//对函数名取*编译器认为还是函数的地址
(************fun)(10);//对函数名取*编译器认为还是函数的地址

2.3函数指针数组

如果你对指针有一定的了解你会知道 int (*p)[10]=a[10]代表数组指针,只有一个指向a[10]地址的指针,而 int *p[10]代表的是指针数组,这是一个数组,但是里面存放的是地址,而不是值。同理函数指针数据里面存放的是多个指针。

void fun(int a)
{}
typedef void (*FUN[4]) (int);
 typedef  void (*FUNa)(int a);
typedef  void FUNab(int a);
FUN p={fun,fun,fun,fun};//可以存储多个函数地址;
FUNab *u[3]={fun,fun,fun};
FUNab u[3]={fun,fun,fun};
 void (*ni[3])(int a)={fun,fun,fun}; 

以上几种表达方式都可以表示函数指针数组

3.回调函数

函数指针作为函数形参 -将这类函数称为 回调函数

int myadd(int a, int  b)
{
	return a + b;
}
	void test(int( *p) (int ,int),int a, int b)
	{
		cout<<p(a,b)<<endl;
	}
int main()
{

	test(myadd,10,20);
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔动山霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值