C/C++ typedef用法总结

前言

  今天学习遇到了一些关于typedef的问题,火速学习并记录。

别名替换

  typedef和宏定义#define一样,都可以对已有内容进行替换。
  但是#define仅仅是做了字符串的替换,等于是生搬硬套换一下,在复杂表达式中没有小括号的辅助很容易翻车。
  而typedef则是为一种类型起了个别名,使用起来比#define安全一些。
  此外typedef还能提供一种“同时声明”的功能,对简化编程很有帮助:

int *a,b;//一个是指针,一个是普通变量
int *a,*b;//两个都是指针

  以上代码中,想要一句定义多个指针变量,需要在每个指针变量前加*号。
  有没有一种偷懒的方式,可以不用在指针变量前加*号呢?

typedef int* intp;
intp a,b,c,d;

  直接掏出答案,利用“同时声明”功能,可以一次对所有的指针变量赋值。

简化结构体实现

  在C语言和C++中实现结构体变量的代码语句有所不同,所以该用途主要用于C语言的场合。

struct MyStruct{
	int a;
	int b;
};

  C++中新建一个以上结构体变量的语句为:

MyStruct cppversion;

  已经很简单了!但是在C语言里还需要在前面加个关键字struct

struct MyStruct cversion;

  这样就搞得比较费事了,所以使用typedef帮忙给代码减下肥:

typedef struct MyStruct{
	int a;
	int b;
}SimpleStruct;

SimpleStruct  cversion;

简化复杂变量类型

  考虑到C/C++中可以使用指针,因此很多时候能够定义出外表相当复杂的变量来,这样的变量不仅写起来难受,用起来更难受。
  因此需要帮忙瘦个身。
  以情况最多的函数指针为例:

int (*func)(int,int,int) = max;//函数指针的赋值方式,max是一个函数的名称
int process(int a,int b,int (*func)(int,int,int));//函数指针被大量用于函数参数中,用于代替传参中的各种其他函数。

  这一长串让人头皮发麻,typedef可以通过替换变量名的方式对完整的函数指针表达式进行替换!

typedef int(*Pfunc)(int,int,int);
Pfunc func= max;//函数指针的赋值方式,max是一个函数的名称,这里func就是一个函数指针
int process(int a,int b,Pfunc func);//函数指针被大量用于函数参数中,用于代替传参中的各种其他函数。这里Pfunc声明一个形参。

后记

  这里转载一下关于复杂声明的解读方式:

理解复杂声明可用的“右左法则”:
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
int (*func)(int *p);
首 先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明 (*func)是一个函数,所以func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func[5])(int *);
func 右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰 func[5]的,原因是[]运算符优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指 针,它指向的函数具有int*类型的形参,返回值类型为int。

也可以记住2个模式:
type (*)(....)函数指针 
type (*)[]数组指针
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值