typedef关键字

来源:互联网 发布:秦安观点 网络强国 编辑:程序博客网 时间:2024/05/16 10:26

一: typedef  简介

1:typedef 是给类型重命名,也就是说该关键字加工出来的都是类型,而不是变量。

2:C语言中的类型主要有两种,分别是编译器定义的类型(int  double 等)和用户自定义类型(数组类型,指针结构体,函数等);

3:typedef 经常用于给比较长的自定义类型起个别名。便于使用。增强程序的可读性


二:类型和变量的区别

1:类型是一个数据模版,是一个实实在在的数据。 不占用内存空间

2:变量占用内存空间


三:typedef 和 # define宏的区别

1:执行时间不同

typedef   在编译阶段起作用,有类型检查的功能

#define  宏定义在编译之前的预处理阶段,只进行替换不进行检查

2:功能略有差异

typedef 用来定义与类型无关的别名,定义与平台无关的数据类型

#define 不仅可以取别名,还可以定义常量,变量

3:作用域不同

typedef 有作用域

#define 无作用域

4:与指针结合时不同(重要)

  1. typedef int * pint;  
  2. #define PINT int *  
  3.   
  4. int i1 = 1, i2 = 2;  
  5.   
  6. const pint p1 = &i1;    //p不可更改,p指向的内容可以更改,相当于 int * const p;  
  7. const PINT p2 = &i2;    //p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p;  

  8.   
  9. pint s1, s2;    //s1和s2都是int型指针  
  10. PINT s3, s4;    //相当于int * s3,s4;只有一个是指针。 


四:typedef 与结构体的混用(一般C项目中的结构体都这样定义,一般用大写,便于记忆)

typedef   struct  teacher
{
char name[20];
int age;

}Teacher,     *pTeacher;

1:定义了两个类型,每个类型有两个名字。(注意是类型,不是结构体变量)

原类型 别名

a: 结构体类型  : strucrt  teacher             teacher

b:结构体指针类型 : struct teacher * pTeacher

2:使用时

原方法  使用别名

strucrt  teacher   p1; teacher  p1;

struct teacher *   p2;pTeacher  p2;(具体使用见结构体指针的使用)



五:typedef 与 const 

consttypedef一起出现时,typedef不会是简单的字符串替换(陷阱1

1: typedef int *PINT;     const PINT p2; 相当于是int *const p2;

2: typedef int *PINT;     PINT const p2; 相当于是int *const p2;

3: 如果想得到 const int *p,需要这样定义 typedef const   int   *CPINT; CPINT p1;


注意:typedef   static   int   INT2;   //不可行 (陷阱2


/******************************************************************************/

六: 使用typedef 的意义

1:简化类型的描述。

一般原则,先找变量,从右向左。

例1: 原声明函数:int   *(*a[10])  (int *,  char*);  变量名为a;

   简化:typedef *(*Func)(int *,  char*);   起别名为Func

Func a[10];


例2:原函数声明 : doube(*)() (*b)[9];     变量名为b;

   简化 :typedef  (*fun_1)();     先简化左边

typedef  fun_1(*Func)[9];再简化右边

     Func *b;


例3:原函数声明 :void   (*c[10])   (void   (*)());  变量名为c;

  简化 :typedef  void (*fun_2)();

typedef (*Func)fun_2;
Func c[10];


type   (*)(....)函数指针   
type   (*)[]
数组指针 


2:很多编程体系下,人们倾向于不使用int、double等C语言内建类型,因为这些类型本身和平台是相关的(譬如int在16位机器上是16位的,在32位机器上就是32位的)。为了解决这个问题,很多程序使用自定义的中间类型来做缓冲。譬如linux内核中大量使用了这种技术.

内核中先定义:typedef intsize_t; 然后在特定的编码需要下用size_t来替代int(譬如可能还有typedef int len_t)

3:STM32的库中全部使用了自定义类型,譬如typedef volatile unsigned int vu32;






















原创粉丝点击