typedef 用法小结

来源:互联网 发布:编程浪子 编辑:程序博客网 时间:2024/06/05 09:16

虽然知道 typedef 基本的用法,但是经常碰到一些奇怪的用法(比如用在函数,指针方面的时候)就比较容易糊涂。于是查了下资料后,在这里做一个总结,欢迎更新和指点。

1,typedef  int  INTEGER   指定用 INTEGER 代表 int 类型。即以下两行语句是等价的。

       int i;

       INTEGER i;

2,typedef struct date

      {

              int month,day,year;

      }DATE,*P;  给结构体date一个新名称 DATE,并声明一个指向此结构体类型的指针。此用法如下所示。

#include<stdio.h>typedef struct node{int a;} NODE,*Pstr;int main(){NODE a;a.a = 20;Pstr t = new node;//此时与NODE *t 是等价的。t->a = 10;printf("%d %d\n",a.a,t->a);return 0;}

3,用typedef 可以声明数组类型。如以下两行代码是等价的。

(1)int a[10],b[10],c[10],d[10];//均是一位数组,大小也相同(2)typedef int ARR[10]; ARR a,b,c,d;//ARR为数组类型,它包含10个元素。因此a,b,c,d都被定义为一维数组,含10个元素
4,当typedef碰到指针,并和const用在一起时。

在string库里面,有比较相等的重载函数strcmp(const char *,const char *);若想用一个别名代替char *。比如:typedef char *  pstr;

则上面的函数参数变为strcmp(const pstr ,const pstr)。其实这样写是错误的!!

const char *p 代表的意思是 p 是一个指向char 的指针常量,所指的内容是不能改变的。而consr pstr 等价于 char * const p,此时所代表的意思是 p 是一个指向char的常量指针,p是不能改变的。

要想用typedef去替换,可以以这种形式:typedef const char * pstr;

5,sigal()是一种系统调用,用于通知运行时系统,在ANSI C标准中,sinnal()的声明如下:

void ( * signal( int sig, void (* func)(int) )) ( int );

看到这个函数的时候有没有感觉到头大?

signal 是一个函数,它返回一个函数指针,这个函数指针所指向的函数接受一个 int 参数并返回 void。

void (* func) ( int );它表示一个函数指针,所指向的函数接受一个 int 参数,返回值是 void。

现在我们用 typedef 来代表通用部分。

typedef void( * ptr_to_func ) ( int );//ptr_to_fun 是一个函数指针,该函数解释一个 int 参数,返回值为 void。

prc_to_func signal( int ,pre_to_func );//它表示 signal 是一个函数,它接受两个参数,其中一个是 int,另一个是 ptr_to_func。返回值是ptr_to_func。

6,当然 typedef 也有缺点,它具有与其他声明一样混乱的语法,同样可以把几个声明器放到一个声明中去。例如:typedef int *pstr,*arr[5]。但是最好不要在一个 typedef 中放几个声明器。

7,typedef 与 define 的区别:

      (1)typedef 可以看成一种彻底的“封装”类型——在声明它之后不能在往里面增加其它的东西。比如:

#define peach intunsigned peach i;/*没问题*/typedef int banana;unsigned banana i;/*错误,非法*/
      (2)在连续几个变量的声明中,用 typedef 定义的类型能够保证所有变量为同意类型,而 #define 不行。比如:

#define int_ptr int *iint_ptr chalk,cheese;//相当于 int *chalk,cheese;即chalk 为指针类型,而cheese为int类型。typedef char * char_ptr;char_ptr Benley,Rolls;//此时两个变量均为 char * 类型。                                                            

原创粉丝点击