最近在学数据结构结构的时候发现对typedef的学习不过透彻,就来学习补充一下。
1.首先了解共同体和结构体的区别
共同体:把不同类型的数据组合成一个整体,自定义类型。
union Person{
int age;
char name[256];
char sex[2];
};
结构体: 使几个不同类型的变量共同占用一段内存。
struct person1
{
int age;
char name[256];
char sex[2];
};
区别:共同体只会存储那个最大的变量,结构体会把结构体里面的所有变量
。
我们可以用sizeof方法来测试一下,我们可以看到共同体只存储最大的内存变量256,而结构体会将所有的内存变量相加:
2.枚举
enum COLOR{
FALSE=0,
TRUE=1,
};
枚举的使用:int i=FALSE;
这里只是做一个简单的例子,枚举的作用是:当需要表示一组特定的预定义状态时,枚举类型对于代码可读性而言非常有用。会让代码可调用和可读性性更好。
3.结构体定义的方式
1.常规定义:
struct time{
int hour;
int minute;
int second;
};
不过需要单独进行声明:struct time t;
2.声明的同时进行定义
struct time1{
int hour;
int minute;
int second;
}t1,t2;
3.使用结构体作为成员
struct time2{
int hour;
int minute;
int second;
};
struct person2{
char name[256];
struct time2 birthday;
};
4.匿名结构体
struct {
int hour;
int minute;
int second;
}t3;
4.typedef的作用和用途
作用:
1.一个是给变量一个易记且意义明确
的新
名字。
2.另一个是简化一些比较复杂的类型
声明。
就是如果你原来结构体的名字太长,太复杂的话,可以使用typedef重新起一个名字。这种情况一般是你编写的代码比较多的时候会使用到。
1.与#define的区别
typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 typedef 在编译时被解释
,因此让编译器来应付超越预处理器能力的文本替换。
程序运行分为这四个阶段:
在编译的时候被解释的话,可以使用编译器提前应付。
1、预处理:条件编译,头文件包含,宏替换的处理,生成.i文件。
2、编译:将预处理后的文件转换成汇编语言,生成.s文件
3、汇编:汇编变为目标代码(机器代码)生成.o的文件
4、链接:连接目标代码,生成可执行程序
2.声明多个指针对象
没有使用typedef的情况:
char* pa, pb;//只有pa定义为了char指针类型,pb为char类型
使用typedef的情况:
typedef char* PCHAR;
PCHAR pa, pb; //两个都为char指针类型
3.直观简洁
没有使用typedef的情况。声明struct新对象时,必须要带上struct,如:
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;
如果使用typedef 的情况时,可以不要写struct
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1;
这种用途一般也是代码比较多的时候,作用才比较大。
4.平台无关性
typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以获得最高的精度:
typedef long double REAL;
在不支持 long double 的机器上,该 typedef 看起来会是下面这样:
typedef double REAL;
并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
参考原文博客:https://blog.csdn.net/wangqiulin123456/article/details/8284939