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主要作用是:程序的通用性和可移植性

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]: 这段代码是一个C++程序,用于输出一系列图案。它使用了嵌套的for循环来控制输出的行数和每行的星号数量。首先,外层的for循环控制了输出的行数,循环变量i从0开始,每次循环增加1,直到i小于4为止。然后,在每一行中,内层的for循环控制了输出的星号数量,循环变量j从0开始,每次循环增加1,直到j小于2*i+1为止。在每次内层循环中,使用cout语句输出一个星号,并在每行结束后输出一个换行符。接着,又使用了一个类似的循环结构来输出倒序的图案。最后,main函数返回0,表示程序正常结束。\[1\] 引用\[2\]: 这段代码是一个C++程序,演示了类的继承的概念。它定义了一个基类Shape和一个派生类Rectangle。基类Shape有两个成员变量width和height,以及两个成员函数setWidth和setHeight用于设置宽度和高度。派生类Rectangle继承了基类Shape,并添加了一个成员函数getArea用于计算矩形的面积。在main函数中,创建了一个Rectangle对象Rect,并使用setWidth和setHeight函数设置了宽度和高度。然后,使用Rect.getArea函数计算并输出了矩形的面积。最后,main函数返回0,表示程序正常结束。\[2\] 引用\[3\]: 这段文字是关于一门C语言程序设计的考试的内容和要求。考试的目的是全面考核学生对于C语言程序设计的学习水平,要求学生掌握C语言的基本结构、基本数据类型、运算符和表达式、程序设计结构、数组及其应用、字符串操作、函数及其应用、结构体共用体和枚举类型、指针及其应用等内容。考试形式为闭卷笔试,考试时间为120分钟,满分200分。参考教材为《C程序设计(第五版)》。\[3\] 问题: c++谭浩强第版网课推荐 回答: 对于C++谭浩强第版的网课推荐,很抱歉,我没有找到相关的引用内容。但是,你可以在各大在线教育平台或者学习网站上搜索C++谭浩强第版的网课,比如Coursera、Udemy、网易云课堂等,这些平台上通常会有许多优质的C++编程课程供你选择。你可以根据课程的评价、内容介绍和适合的学习方式来选择适合自己的网课。另外,你也可以参考一些学习网站上的教程和资料,比如C++ Primer、cplusplus.com等,它们提供了丰富的C++学习资源,可以帮助你更好地学习和理解C++编程。 #### 引用[.reference_title] - *1* [谭浩强c++版3-24](https://blog.csdn.net/weixin_44817229/article/details/104673564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++面向对象程序设计总复习](https://blog.csdn.net/Yalena_/article/details/125297313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c语言设计程序实现顺序冒泡_专业课C语言程序设计考试大纲](https://blog.csdn.net/weixin_39976382/article/details/110149678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值