c语言结构体、枚举、共用体定义与使用(内含代码详解)

一、结构体

好文详细链接:https://blog.csdn.net/qq_44358197/article/details/90812372?spm=1001.2014.3001.5501

(1) 结构体是一种构造数据类型
把不同类型的数据组合成一个整体
(2)结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型

结构体:(变量赋值定义)

struct{
    char name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组
    float score;  //成绩
} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };

在这里插入图片描述

eg.(结构体数组)

 struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }class[] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };
a=10;
a=9;
this->a=a;

eg、typedef说明结构体类型
在这里插入图片描述

结构体数组的使用,例如,获取 Wang ming 的成绩:class[4].score;

二、枚举:

枚举类型变量需要存放的是一个整数,它的长度和 int 相同

  1. 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内
    部),不能再定义与它们名字相同的变量。
  2. Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。
    枚举值的比较规则是:按其在说明时的顺序号比较,如果说明时没有人为指定,则第一个枚举元素的值认作 0
  3. 枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。
    我们可以将枚举理解为编译阶段的宏。

enum weekday{sun,mon,tue,wed,thu,fri,sat};
定义了一个枚举类型名 enum weekday,然后定义变量为该枚举类型。例如:
enum weekday day;
当然,也可以直接定义枚举类型变量。例如:
enum weekday{sun,mon,tue,wed,thu,fri,sat} day;
其中,sum,mon,…,sat 等称为枚举元素或枚举常量,它们是用户定义的标识符。

#include <stdio.h>
int main(){
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
    scanf("%d", &day);
    switch(day){
        case 1: puts("Monday"); break;
        case 2: puts("Tuesday"); break;
        case 3: puts("Wednesday"); break;
        case 4: puts("Thursday"); break;
        case 5: puts("Friday"); break;
        case 6: puts("Saturday"); break;
        case 7: puts("Sunday"); break;
        default: puts("Error!");
    }
    return 0;
}

eg、 从键盘输入一个整数,显示与该整数对应的枚举常量的英文名称。

 include
void main( )
{
enum weekday {sun,mon,tue,wed,thu,fri,sat} day;
int k;
printf("input a number(0--6)")scanf("%d",&k);
day=(enum weekday)k;
switch(day)
{
case sun: printf("sunday/n")breakcase mon: printf("monday/n")breakcase tue: printf("tuesday/n")breakcase wed: printf("wednesday/n")breakcase thu: printf("thursday/n")breakcase fri: printf("friday/n")breakcase sat: printf("satday/n")breakdefaultprintf("input error/n")break}
}
程序运行结果为:
input a number(0--6)1
monday 
#include<stdio.h>
enum Season
{
    spring, summer=100, fall=96, winter
};
typedef enum
{
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
Weekday;
void main()
{
    /* Season */
    printf("%d \n", spring); // 0
     printf("%d \n", winter);//97
	printf("%d, %c \n", summer, summer); // 100, d
    printf("%d \n", fall+winter); // 193
 
    
    int x=100;
    if(x==summer)
    printf("%d bytes\n", sizeof(spring)); // 4 bytes
    /* Weekday */
    printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4
    Weekday today = Saturday;
    Weekday tomorrow;
	printf("%d \n", Monday);
	printf("%d \n", Tuesday);
	printf("%d \n", Wednesday);
	printf("%d \n", Thursday);
	printf("%d \n", Friday);
}

Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,
Mon、Tues、Wed 等都不是变量,
它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,
而是直接被编译到命令里面,放到代码区,所以不能用&取得它们的地址

三、共用体

共用体在一般的编程中应用较少,在单片机中应用较多。
对于 PC 机,经常使用到的一个实例是:
现有一张关于学生信息和教师信息的表格。
学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目
f 和 m 分别表示女性和男性,s 表示学生,t 表示教师。
可以看出,学生和教师所包含的数据是不同的。
现在要求把这些信息放在同一个表格中,并设计程序输入人员信息然后输出。
如果把每个人的信息都看作一个结构体变量的话,
那么教师和学生的前 4 个成员变量是一样的,第 5 个成员变量可能是 score 或者 course
当第 4 个成员变量的值是 s 的时候,第 5 个成员变量就是 score
当第 4 个成员变量的值是 t 的时候,第 5 个成员变量就是 course

#include <stdio.h>
#include <stdlib.h>
#define TOTAL 4  //人员总数
struct{
    char name[20];
    int num;
    char sex;
    char profession;
    union{
        float score;
        char course[20];
    } sc;
} bodys[TOTAL];
int main(){
    int i;
    //输入人员信息
    for(i=0; i<TOTAL; i++){
        printf("Input info: ");
        scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession));
        if(bodys[i].profession == 's'){  //如果是学生
            scanf("%f", &bodys[i].sc.score);
        }else{  //如果是老师
            scanf("%s", bodys[i].sc.course);
        }
        fflush(stdin);
    }
    //输出人员信息
    printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");
    for(i=0; i<TOTAL; i++){
        if(bodys[i].profession == 's'){  //如果是学生
            printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score);
        }else{  //如果是老师
            printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course);
        }
    }
    return 0;
}

运行结果:

Input info: HanXiaoXiao 501 f s 89.5↙
Input info: YanWeiMin 1011 m t math↙
Input info: LiuZhenTao 109 f t English↙
Input info: ZhaoFeiYan 982 m s 95.0↙

Name            Num     Sex     Profession      Score / Course
HanXiaoXiao     501     f       s               89.500000
YanWeiMin       1011    m       t               math
LiuZhenTao      109     f       t               English
ZhaoFeiYan      982     m       s               95.000000

原文链接:http://blog.qmgua.com/?id=145

=========================================

http://blog.qmgua.com/ 为 “布尔博客” 唯一官方服务平台,请勿相信其他任何渠道

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸运的涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值