C语言:随笔10--共用体

共用体概念:使用几个不同的变量共占通一段内存的结构称为“共用体”类型的结构。

定义共用体类型变量的一般形式为:

union 共用体名
{
   成员列表
}变量列表; 
//有点类似于结构
//例子
union data
{
   int i;
   char ch;
   float f;
}a,b,c;//abc表示这个共用体的变量
//或者可写为:
union data
{
   int i;//占4个子节
   char ch;//占1个子节
   float f;//占4个字节
};
union data a,b,c;//所以在整个共用体内共用体共占4个字节,不是所有之和9。

共用体和结构体的比较:

(1)结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。

而共用体变量所占的内存长度等于最长的成员的长度。(例如上边定义的“共用体”变量a,b,c各占4个字节(因为一个实型和整型变量都是占4个子节)而不是各占4+1+4=9个子节)

(2)只有先定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员。

例如前面定义了a,b,c为共用体变量。a.i(引用共用体变量中的整型变量i)a.ch,a.f。但是不能把变量a拿来引用。

(3)同一个内存段可以用来存放机中不同类型的成员,但是每一瞬间只能存放其中一种,而不是同时存放几种。(就是不能兼容)(一个时间只能存放一种)

(4)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。(因为上一次存放的已经被下一次的给覆盖掉了)

(5)共用体变量的地址和它的各成员的地址都是同一个地址。

(6)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,又不能在定义共用体变量时对它初始化。

(7)不能把共用体变量作为函数参数,也布恩那个使函数待会共用体变量,但可以使用指向共用体变量的指针。

(8)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。

例子:假设有若干个人员的数据,其中有学生和教师。学生的数据包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、植物。可以看出,学生和教师所包含的数据是不同的。现要求把他们放在同一个表格中。

代码:

#include<stdio.h>
struct//定义一个结构,因为他还有其他的一些数据
{
  int num;
  char name[10];
  char sex;
  char job;
  union
  {
     int banji;
     char position[10];
  }category;//是班级或者是职务,那么我们定义一个union,任选其一

}person[2];//为了方便假设一个学生一个老师

void main()
{
   int I;
   for(I=0;i<2;i++)
   {

   }

}

结果:

---枚举类型:

在实际问题中,有些变量的取值被限定在一个有限的范围内。(例如一个星期只有7天。)把这些量说明为整型,字符型或其他类型显然是不妥当的。因此C语言提供一种“枚举”类型。

设有变量a,b,c被说明为山鼠的weekday,可采用下述任一种方式:

//第一种
enum weekday{sum,mou,tue,wed,thu,fir,sat};
enum weekday a,b,c;
//第二种
enum weekday{sum,mou,tue,wed,thu,fir,sat}a,b,c;
//第三种
enum {sum,mou,tue,wed,thu,fir,sat};

----typedef定义类型

typedef是给已知的类型名起别名。

typedef声明新的类型名来代替已有的类型名。

//比如声明INTEGER为整型
typedef int INTEGER;//为int这个整型取一个别名叫做INTEGER,只要在程序中出现了INTEGER就是int。

//再加深,比如说我们要声明的是结构类型
#include <stdio.h>
Typedef struct
{
    int month;
    int day;
    int year;
}DATE;//为struct这个结构取一个别名叫做DATE。
//事实上DATE就是上边的结构。

void main()
{
    DATE date_one;//用一个结构定义一个变量
    date_one.month=9;
    date_one.day=22;
    date_one.year=2020;//在为date_one赋值。
    printf("%d-%d-%d-\n",date_one.month,date_one.day,date_one.year);
}

用typedef为NUM声明一个整型数组类型:

//声明格式:
typedef int NUM[100];//说明他的类型是int整型的,他有100个变量

#incluede<stdio.h>
typedef int NUM[100];//说明他的类型是int整型的,他有100个变量
void main()
{
    NUM num={0};//用NUM来定义一个小的num,并给他赋初值//此处注意了NUM不用加后边的[100],因为你只是一个修饰,修饰说上边的这个名称NUM数组有多少个成员变量而已。所以这里只要用他的名字就行了
    printf("%d\n\n",sizeof(num));
}

声明STRING为字符指针类型:

typedef char* STRING

#include<stdio.h>
typedef char* P;//为char*起别名叫做P
void main()
{
   P p1;//用P来命名p1
   p1="I lOVE";//p1指向一个字符串常量
   printf("%s",p1);//打印
}

声明POINTER为指向函数的指针类型,返回整型值。

typedef int (*POINTER)();//后边一个括号()表示他是一个函数,再一个括号(*POINTER)表示指向的这个函数名是用一个指针指向他的。

#include<stdio.h>

typedef void (*P)();
void fun();
void main()
{
    P p1;//用P声明了一个p1指针,这个p1指针是(*P)()这个类型//实际上就是这样一个声明 void (*p1)();
    p1=fun;//p1指向fun//fun是函数的名称,(函数名称和这个函数的地址就是同一个东西,所以此处加不加“&”符(即&fun)都是是一样的)刚好可以把他替代进去
    (p1)();//上边一句只是赋值,还没有调用。//它是一个函数,所以要加上括号

}
void fun()
{
    printf("I Love");
}

说明:typedef可以声明各种类型名,但不能用来定义变量。

typedef只是对已经存在的类型增加一个类型名,而没有传召新的类型。

当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把他们单独放在一个文件中,然后在需要用到他们的文件中用#include命令把他们包含进来。

typedef与#define 有相似之处,例如:typedef int COUNT;#define COUNT int的作用都是用COUNT代表int。但是,它们两者是不同的。

#define是在预编译处理的,他只是作简单字符串替换,而typedef是在编译时处理的。实际上它并不是作简单的字符串替换,而是采用如同定义变量的方法哪样来设革命一个类型。

typedef (int*) p1;//p1这个名称是指向整型指针的。

猜你喜欢

转载自blog.csdn.net/m0_37957160/article/details/108735367