typedef 的理解



①/**********以下是用typedef定义函数指针的别名带来的好处之一*********/

typedef int (*fun)(int a,int b)



fun  Fun1 =(fun)(0x00001122);


Fun1(a,b,c); //或者(*Fun1)(a,b,c);




//如果不采用typedef这种办法,那么实现相同的该怎么处理呢?




int (*Fun1)(int a,int b); //或者(*Fun1)(a,b,c);


Fun1 =(int(*)(int ,int ) )(0x00001122);
Fun1(a,b,c);




//简单点写的话,可以改成如下写法


int (*Fun1)(int a, int b) = (int(*)(int ,int))(0x00001122);
Fun1(a,b,c); //或者(*Fun1)(a,b,c);






//这样看上去就稍微麻烦一些,因为要写两次函数指针的格式,容易出错所以常用
//还是用typedef。




②ypedef & 复杂的变量声明
理解复杂声明可用的“右左法则”:
  从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
  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 (*)[]数组指针
在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
>1:int *(*a[5])(int, char*);
>2:void (*b[10]) (void (*)());
>3. doube(* (*pa)[9])();
答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明 表达式里用 类型名替代变量名,然后把 关键字typedef加在该语句的开头就行了。
>1:int *(*a[5])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[5];
>2:void (*b[10]) (void (*)());
//首先为上面 表达式蓝色部分声明一个新类型
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[10];
>3. double(* [1]   (*pa)[9])() [2]   ;
//首先为上面表达式蓝色部分声明一个新类型
typedef double(*pFun)();
//整体声明一个新类型
typedef pFun (*pFunParam)[9];
//使用定义的新类型来声明对象,等价于double(*(*pa)[9])();
pFunParam pa;
pa是一个指针,指针指向一个数组,这个数组有9个元素,每一个元素都是“doube(*)()”--也即一个指针,指向一个函数,函数参数为空,返回值是“double”。

辅助理解 char * a[10]  ;      a[10]含义 a是一个指针,指向一个有10个元素数组的首地址; char * a[10] 说明数组中有10个元素,每个元素都是指向 char 型的指针。
*在这里的含义是表明是指针 ,不是取地址的意思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值