C语言结构体,联合,枚举类型,typedef

C语言结构体,联合,枚举类型,typedef

结构体

直接看代码:

#include "stdio.h"
#define MAX_TITLE 30
#define MAX_AUTHOR 30
#define MAX_BOOKS 10

struct book{
    char title[MAX_TITLE];
    char author[MAX_AUTHOR];
    float price;
};

struct volume{
    // 结构体的数组
    struct book books[MAX_BOOKS];
};

struct library{
    struct volume volumes[MAX_BOOKS];
    struct book books[MAX_BOOKS];
    char address[MAX_TITLE];
    char name[MAX_TITLE];
};

struct manager{
    // 结构体的指针
    struct library *library;
    char name[MAX_AUTHOR];
    char phoneNumber[10];
};

void printBookInfo(struct book books[],int length){
    for (int i = 0; i < length; ++i) {
        // 结构体的数组是如何读取其中的输入的
        printf("book title:%s,author:%s,price:%f\n",books[i].title,books[i].author,books[i].price);
    }
}

int main(){
    // 可以设置这种未定义具体 structure 名称的结构体
    struct {
        char name[MAX_AUTHOR];
        char phone[20]
    } John={
            "John",
            "110"
    };
    // 初始化结构体的时候,可以采用 .key= 这样的形式指定当前赋值的结构中的成员
    struct library CityTown={
            .address="LosAngle",
            // 如果未指定,则默认是前一个指定的成员的下一个成员
            "CityTown"
    };
    struct manager Noel={
            // 指针赋值,可以看出没有什么不同
            .library=&CityTown,
            .name="Noel",
            "911"
    };
    // 这里主要就是演示如何读取指针的值
    printf("%s is a library manager of %s.\n",Noel.name,(*Noel.library).name);
    // 但是上面的形式写起来很复杂,所以可以采用 -> 的形式读取指针中的值
    printf("%s's address is %s.\n",Noel.library->name,Noel.library->address);
}

联合

联合在语法上和结构体是类似的,只是联合是其中的所有变量都使用同一块内存来存储不同种类的数据,比如下面这个代码例子:

#include "stdio.h"

union token{
    char token[20];
    char cookie[30];
};

void main() {
    union token identify = {
            .cookie="cookie"
    };
    char token[20]="tooken";
    identify.token[0]='t';
    int stop=1;
}

image-20210417152925050

image-20210417153008960

枚举类型

这个枚举类型是为了提高代码的可读性的,简单来说就是可以批量定义一批int类型的数据,比如下面的代码:

#include "stdio.h"

enum rainbowColor {
    red,
    orange,
    yellow,
    green
};

void main() {
    printf("%d,%d,%d,%d\n",red,orange,yellow,green);
}

输出结果为:

0,1,2,3

也可以自己设定对应的值所对应的int型的值:

#include "stdio.h"

enum rainbowColor {
    red,
    orange,
    yellow,
    green
};

enum setRainbowColor{
    Red,// 默认从0开始
    Orange=100,
    Yellow,// 如果没有没有设置对应的值,则从之前的值开始计数,比如这里就是 101
    Green // 这里是102
};

void main() {
    printf("%d,%d,%d,%d\n",red,orange,yellow,green);
    printf("%d,%d,%d,%d\n",Red,Orange,Yellow,Green);
}

typedef

预处理部分见这里

这里主要提一下typedef和#define之间的区别:

  1. #define是面向预处理器的,typedef是面向编译器的
  2. typedef只能定义类型名,但是不能定义值

这个的好处有2个:

  1. 适配多种程序环境。这个就不举实际的计算机例子,而是举个生活中的例子,比如我定义:
typedef 豆腐脑 咸豆腐脑

这样的程序在北方的程序中没有问题,但是一旦到了南方,那就很麻烦了,所以我可以立刻修改成

typedef 豆腐脑 甜豆腐脑

这样在外部程序看来,使用的都是豆腐脑这个变量,只是我修改了其具体的值而已。

  1. 定义复杂的类型,比如一些比较较真的人:

typedef 奶茶套餐1 大杯,半糖,去冰,先加奶盖,再加芝士

这样下次你就只需要在代码中写奶茶套餐1,剩下的内容就交给编译器去帮你转换了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值