除了可以直接使用C提供的标准类型名(如int char float等)和自己声明的结构体等类型外,还可以用typedef声明新的类型名来代替已有的类型名。 习惯上常把typedef声明的类型名用大写字母表示,以便与系统提供的标准类型标识符相区别
1、typedef int INTEGER; typedef float REAL; 如果一个程序中,一个整形变量用来计数,可以 typedef int COUNT; COUNT i,j; 2、可以声明结构体类型
typedef struct{ int month; int day; int year;}DATE;声明新类型名DATE,它代表上面指定的一个结构体类型。这时,就可以用DATE定义变量: DATE brithday; DATE * p; 3、还可以进一步: 1)、typedef int NUM[100]; NUM n; 声明NUM为整形数组类型,定义n为整形数组变量; 2)、typedef char * STRING; STRING p,s[10]; 声明STRING为字符指针类型 3)、typedef int (* POINTER)( ) 声明POINTER为指向函数的指针类型,该函数返回整型值;
1】注意#define是在预编译时处理的,它只能作简单的字符串替换,而typedef 是在编译时处理的。实际上它并不是作简单的字符串替换。
2】当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include命令把它们包含进来。
3】使用typedef有利于程序的通用和移植。有时程序会依赖硬件特性,用typedef便于移植。例如,有的计算机系统int型数据用两个字节、数据范围为-32768~32767,而另外一些机器则以4个字节存放一个整数,数值范围为+-21亿。如果把一个C程序从一个以4个字节存放整数的计算机系统移植到以2个字节存放整数的系统,按一般方法需要将定义变量中的每个int改为long。例如,将“int a,b,c;”改为“long a,b,c;”,如果程序中有多处用int 定义变量,则要改动多处。现在用一个INTEGER 来声明int: typedef int INTEGER; 在程序中所有整型变量都用INTEGER定义。在移植时只需改动typedef定义体即可: typedef long INTEGER;
普通结构体声明时使用只struct关键字,而链表需要typedef struct,比较疑惑他们之间的区别 (1) 在C中定义一个结构体类型要用typedef:
typedef struct Student { int a; }Stu;则声明变量是这种形式:Stu stu1; 如果没有typedef就必须用struct Student stu1;来声明。Stu实际上就是struct Student的别名。 另外这里也可以不写Student
typedef struct { int a; }Stu;则声明形式必须是Stu stu1; 2)在c++中定义一个结构体类型:
struct Student { int a; };于是就定义了结构体类型Student,声明变量时直接Student stu2
typedef struct Student2 { int a; }stu1;//stu1是一个结构体类型 struct Student { int a; }stu2;//stu2是一个变量注意带typedef关键字,其就为类型,不带就为变量 还应该注意的是,C++为了C程序员的习惯,保留了Struct关键字,但是其意义与Class相同,唯一的区别是Struct默认成员权限为public。
3) 链表的声明
//方式1typedef struct ListNode { DataType data; struct ListNode *next; }Node,*LinkList; //方式2struct ListNode{DataType data; struct ListNode *next; }; typedef struct ListNode Node; typedef Node *Linklist; //方式3 typedef struct ListNode { DataType data; struct ListNode *next; }Node; typedef Node *LinkList;因为都有typedef关键字,所以后面声明的都是类型。其中Node与LinkList本质是一样的,只不过一个是Node类型结构体,一个是指向Node的指针。但是理解时LinkList应该是高层次的意义,即一个链表。
新闻热点
疑难解答