第九章 用户自己建立数据类型(二)

章节结构

  • 共用体类型
    • 什么是共用体类型
    • 引用共用体变量的方式
    • 共用体类型数据的特点
  • 使用枚举类型
    • 两种使用方式
    • 涉及枚举的几个概念
  • 用typedef声明新类型名
    • 简单的用一个新的类型名代替原有的类型名
    • 命名一个简单的类型名代替复杂的类型表示方法

共用体类型

什么是共用体类型

使用同一段内存单元存放不同类型的变量。

如把一个短整型变量、一个字符型变量和一个实型变量放在同一个地址开始的内存单元中。

这种将几个不同数据类型的变量共享同一段内存的结构,称为共用体类型的结构,因此结构体变量所占的内存长度等于最长的成员的长度

两种方法

  • 先声明一个共用体类型,在定义该类型的变量
union 共用体名
{
	成员表列
}
union 共用体名 共用体变量名;
  • 声明共用体类型的同时定义该类型的变量(此处有两种具体方法)
    • 声明时声明共用体名
    • 声明时不声明共用体名
// 声明时声明共用体名
union 共用体名
{
	成员表列
}变量表列;

//声明时不声明共用体名
union
{
	成员表列
}变量表列;

引用共用体变量的方式

只有先定义了共用体变量才能引用它。
但是不能引用共用体变量,只能引用共用体变量的成员
引用方式如下: 共用体变量名.成员名

共用体类型数据的特点

  • (1)同一内存段可以用来存放几种不同类型的成员,但是在每一瞬间只能存放其中一个成员,而不是同时存放几个

因为在每一瞬时,存储单元只能有为以的内容。
也就是说在共用体变量中只能存有一个值

  • (2)可以对共用体变量初始化,但初始化表中只能有一个常量。(原因:参见上一条)
  • (3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。
  • (4)共用体变量的地址和它的各成员的地址都是同一个地址
  • (5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。

在C99同类型的共用体变量可以互相赋值
共用体变量名1 =共用体变量名2 //两者为同类型的共用体变量,合法

  • (6)以前的C规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指针作函数参数。C99允许用共用体变量作为函数参数
  • (7)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。同样的,结构体也可以出现在共用体类型定义中,数组也可以作为共用体共用体的成员

使用枚举类型

如果一个变量只有几种可能的值,就可以定义为枚举类型
枚举,就是把可能的值一一列举出来,变量的值只限于列举出来的值得范围内。

两种方式使用
enum [枚举名][枚举元素列表]

  • 先声明枚举类型,在定义枚举变量

    • 声明枚举类型用enum开头
      enum Weeday{sun,mon,tue,wed,thu,fri,sat};
    • 用此类型来定义变量
      enum Weeday workday,weekend
  • 不声明有名字的枚举类型,而直接定义枚举变量(与结构体类似) enum {sun,mon,tue,wed,thu,fri,sat} workday,weekend

涉及枚举的相关概念

  • 枚举类型: enum + 枚举名
  • 枚举变量: enum + 枚举名 + 枚举变量名
  • 枚举元素(或称为枚举常量)::声明枚举类型时花括号里面的内容
  • (1)C编译对枚举类型的枚举元素按常量处理,因此不能对它们赋值
  • (2)每一个枚举元素都代表一个整数,C语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5...。
    也可以人为地指定枚举类型元素的数值,在定义枚举类型时显示地指定
    enum Weekday{sun =7,mon=1,tue,wed,thu,fri,sat}workday,week_end; 此处指定枚举常量sun值为7;mon为1,以后的顺序加1,sat为6
  • (3)枚举元素可以用来做判断。

枚举元素的比较规则是按其在初始化时指定的整数来进行比较的。
如果定义时没有认为指定,则按默认规则处理,即第1个枚举元素的值为0,依次加1
if(workday == mon)...
if(workday >sun)...

用typedef声明新类型名

(语法:typedef 原来的类型名 新的类型名

  • 习惯上,常把用typedef声明的类型名的第1个字母用大写表示,以便与系统提供的标准类型标识符相区别
  • 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型。
    可以把所有的typedef名称单独放在一个文件中,然后再需要用到它们的文件中用#include指令把它们包含到文件中
  • 使用typedef名称有利于程序的通用与移植。

typedef VS #define

typdedef 和#define的作用一样都是起别名。

  • #define是在预编译时处理的,它只能作简单的字符串替换。
  • typedef是在编译阶段处理的。它不是简单的替换。而是采用如同定义变量的方法那样先出生成一个类型名,然后去定义变量

使用typedef指定新的类型名来代替已有的类型名。有两种情况

  • (1)简单地用一个新的类型名代替原有的类型名
    如:type int Integer; //指定Integer为类型名,作用与int相同
  • (2)命名一个简单的类型名代替复杂的类型表示方法
    • 命名一个新的类型名代表结构体类型
    	typde struct
    	{
    		int month;
    		int day;
    		int year;
    	}Date
    	此时新的类型名就是Date
    	Date birthday; //此处定义了一个Date结构体类型的变量birthday
    
    • 命名一个新的类型名代表数组类型
    • 命名一个新的类型名代表指针类型
    • 命名一个新的类型名代表指向函数的指针类型
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部