c语言入门到c++使用高手: c语言入门之结构体与共用体(三)

第十章 结构体与共用体

第三节 共用体,枚举类型,typedef

1. 共用体

  • 又叫联合

  • 把几种不同类型的变量存放到同一段内存单元(同一个内存地址开始的单元中),几个变量共同占用同一段内存的结构,就叫共用体

  • 定义形式:

union 共用体名
{
    成员列表
}变量列表
  • 实例一
union myuni
{
    int carnum;
    char cartype;
    char cname[60];
}a,b,c;//将共用体定义和变量定义放在一起
  • 实例二
union myuni
{
    int carnum;
    char cartype;
    char cname[60];
};

union myuni a, b, c;
  • 结构体和共用体是明显不同的,结构体占用的内存是各个成员占用的内存之和,共用体是占用的内存是成员变量中最长的成员长度
#include <iostream>
#include <cstring>

union myuni {
    int carnum;
    char cartype;
    char cname[60];
};

struct mystru {
    int carnum;
    char cartype;
    char cname[60];
};


int main(int argc, char *argv[]) {
    printf("struct mystru %d\n", sizeof(mystru));
    printf("union myuni %d\n", sizeof(myuni));
    return 0;
}
几点说明
  • 共用体变量的引用,a.carnum

  • 共用体变量的特点:每一个瞬间只能存放其中一种,即只有一个成员存在

#include <iostream>
#include <cstring>

union myuni {
    int carnum;
    char cartype;
    char cname[60];
}a;

struct mystru {
    int carnum;
    char cartype;
    char cname[60];
};


int main(int argc, char *argv[]) {
    a.carnum = 123;
    strcpy(a.cname, "FF");
    printf("a.carnum: %d\n", a.carnum);
    printf("a.cname: %s\n", a.cname);
    return 0;
}
  • 共用体变量地址和其成员变量的地址都一样

  • 共用体变量不能在定义的时候初始化,只能给定第一个成员类型

  • 不能把共用体变量作为函数参数,也不能让函数返回共用体变量

2. 枚举类型

  • 四种颜色: 红, 绿, 蓝, 黄, // Red表示红色, Green表示绿色, Blue表示蓝色, Yellow表示黄色
enum color
{
    //枚举常量(当成编号,整型数字)
    Red,    //0
    Green,  //1
    Blue,   //2
    Yellow  //3
};

enum color mycolor1, mycolor2;//定义了两个枚举变量

  • 说明:

a) 枚举:就是将值一一列举出来,那么mycolor1和mycolor2变量的值只限于列出来的这些值的范围内

b) Red, Green, Blue, Yellow都是枚举常量(当成编号,整型数字),不能改变

c) 可以直接给枚举型变量赋值

#include <iostream>
#include <cstring>

enum color {
    //枚举常量(当成编号,整型数字)
    Red,    //0
    Green,  //1
    Blue,   //2
    Yellow  //3
};


int main(int argc, char *argv[]) {
    enum color mycolor;
    mycolor = Red;
    printf("sizeof color: %d\n", sizeof(mycolor));
    return 0;
}

d) 定义枚举常量时,可以给枚举常量赋值

#include <iostream>
#include <cstring>

enum color {
    //枚举常量(当成编号,整型数字)
    Red=-6,
    Green,  //-7
    Blue=8,
    Yellow  //9
};

int main(int argc, char *argv[]) {
    enum color mycolor;
    mycolor = Yellow;
    printf(" Yellow: %d\n", mycolor);
    return 0;
}
  • 枚举值就可以理解成整型值, 枚举值也可以赋给整型

  • 枚举值可以做比较

#include <iostream>
#include <cstring>

enum color {
    //枚举常量(当成编号,整型数字)
    Red = -6,
    Green,  //-7
    Blue = 8,
    Yellow  //9
};

int main(int argc, char *argv[]) {
    enum color mycolor;
    mycolor = (enum color) (-6);
    if (mycolor == Red) {
        printf("ok!\n");
    }

    // 枚举值就是整型值, 它们是可以互通的,但是一般不这么使用
    mycolor = (enum color) (20000);
    printf("%d\n", mycolor);

    int c = Red;
    printf("%d\n", c);
    return 0;
}

3. 用typedef来定义类型

  • 使用typedef来定义新的类型名,来代替已有的类型名
typedef int INTEGER; // 用INTEGER代表了int
INTEGER a;
  • 定义结构体变量
typedef struct date
{
    int year;
    int month;
    int day;
}DATA;//定义结构体变量

DATA birthday;
DATA *p;//p为指向此结构体类型数据的指针
  • 变形

a) typedef int NUM[100];//定义NUM为整型数组类型, NUM n ==> int n[100];

b) typedef char *PSTRING; //定义PSTRING为字符指针类型, PSTRING p ==> char *p

c) typedef int (*POINTER()); //定义POINTER为指向函数的指针类型,该函数返回的类型是int型, POINTER p1;

  • 总结(以整型数组定义为例)
  1. 先写出常规的整型数组方法

  2. 将变量替换成自己想用的类型名

  3. 在前面加上typedef

1. int n[100];
2. int N[100];
3. typedef int N[100];
//最后定义对应变量
N a;

  • 说明
  1. 类型别名一般都大写

  2. typedef是用来定义类型名的,不是用来定义变量的

  3. typedef只是对已经存在的类型增加类型名

  4. typedef是编译的时候处理的, 可执行文件:编译(预处理(#define, #include, #ifdef),编译(typedef), 汇编),链接

  5. typedef主要作用是:程序的通用性和可移植性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值