共用体,枚举体和typedef

共用体变量定义
union  共用体名
{
     成员表列
}变量表列;
特点:1.同一个内存段可以用来存放几种不同类型的成员 ,但在每一瞬间只能存放其中一种,而不是同时存放几种。共用体变量中起作用的是最后一次存放的成员。共用体变量的地址和它各个成员的地址都是同一地址。
            2.不能对共用体变量名赋值,不能引用变量名来得到一个值,不能在定义共用体变量时对它初始化。
            3.不能把共用体变量作为函数参数,也不能是函数带回共用体变量,但可以使用共用体变量的指针。(与结构体变量这种用法相仿)。
            4.共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体中,数组也可以作为共用体的成员。
 
枚举体
声明枚举体:enum  weekday{sun,mon,tue,wed,thu,fri,sat};
声明了一个枚举类型enum  weekday,可以用此类型来定义变量:enum  weekday  workday,week-end;
workday,week-end  的值只能是列表中的一个(sun-sat)。
说明:1.C编译中,对枚举元素按常理处理,故称枚举常量,不能对它们赋值。
           2.枚举元素作为常量,它们是有值的,默认为0,1,2,3....。枚举元素的值也可在定义时由程序员制定。
           3.枚举值可以用来作判断比较。如:if(workday==mon).....    if(workday>sun)....。一个整数不能直接赋给一个枚举变量。
                           workday=(enum weekday)2;
 
用tyedef定义已有类型的别名:
int *p;                //p是类型为int *型的变量
typedef int *p;  //p 是数据类型名(typedef-name),是int *p中p的数据类型int *

int NUM[100];   //NUM是数据类型为 int[100]的变量
typedef int  NUM[100];   //NUM是含有100个元素的数组类型的typedef-name,例如  int a[100];NUM b=a;
typedef int (*NUM)[100];//int a[100]; NUM b=&a;

int *Func(int);    //Func的类型是函数标识符,返回值类型int*,参数为int  
typedef int *Func(int);  //Func是函数类型的typedef-name,该函数返回值为int*,参数为int。Func *fptr; (fptr则是函数指针)
typedef int (*Func)(int)  //Func是指向函数的指针的数据类型名。Func fptr;(fptr则是函数指针)
typedef struct{int mongth}DATA;         // DATA  birthday;
typedef struct student STUD;
typedef long duble REAL;  
//定义与平台无关的数据类型,用REAL定义一个浮点数,有些平台支持long duble,而有的平台不支持,则只需修改这里即可。提高了可移植性

说明:1.习惯上常把用typedef声明的类型名用大写字母表示。

          2.typedef与#define:#define是在预编译是处理的,它只能做字符替换,而typedef是在编译时处理的,不是做简单的替换。
         3.当不同 源文件中用到同一类型数据(尤其像数组,结构体,共用体,等)时,常用typedef声明一些数据类型,把他们单独放在一个文件中,然后在需要用到它们的文件中把他们包含进来。
         4.使用typedef有利于程序的通用与移植。
 
较复杂的原型声明:void (*b[10]) (void (*)());

变量名为b,先替换右边部分括号里的,pFunParam为别名一:

typedef void (*pFunParam)();

再替换左边的变量b,pFunx为别名二:

typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];

原文地址:https://www.cnblogs.com/zhoutian220/p/4007180.html