C语言学习笔记 入门篇-6

前言

本篇学习结构体枚举,结构体相当于java里面的类。

PS:本系列内容为程序媛学习C语言时做的笔记。以代码为主,并备注了打印结果以及详尽的解释注释。希望对你有所帮助。
C语言笔记入门篇包含多篇内容,当前位置:第六篇
C语言并不可怕,请沉下心来,耐心就有收获。
在这里插入图片描述

结构体定义与使用

#include <stdio.h>
#include <string.h>

struct Dog {
    char *name;
    char color[10];
    int age;
    char sex;
};

int main() {
    struct Dog dog = {"小花", "黄色", 1, 'M'};
    printf("dog信息:name:%s   color:%s   age:%d  sex:%c\n", dog.name, dog.color, dog.age, dog.sex);
    //name:小花  age:1  sex:M

    struct Dog dog2;
    //这样写完成员没有初始化,默认为系统值
    printf("dog2信息:name:%s   color:%s   age:%d  sex:%c\n", dog2.name, dog2.color, dog2.age, dog2.sex);
    //dog2信息:冹?$╔,,6422280,?

    //给dog2赋值
    dog2.name = "小黑";//char * 可直接用=赋值
    strcpy(dog2.color, "黑色");//char color[10] 要用strcpy()赋值
    dog2.age = 2;
    dog2.sex = 'G';
    printf("dog2信息:name:%s   color:%s   age:%d  sex:%c\n", dog2.name, dog2.color, dog2.age, dog2.sex);
    //dog2信息:name:小黑   color:黑色   age:2  sex:G

    return 0;
}

第二种定义方法

struct Dog {
    char *name;
    char color[10];
    int age;
    char sex;
} d1 = {"花花", "黄色", 1, 'M'}
, d2
, d3;

int main() {
    //d3赋值
    d3.name = "黑云";
    strcpy(d3.color, "黑色");
    d3.age = 3;
    d3.sex = 'G';

    printf("d1信息:%s,%s,%d,%c\n", d1.name, d1.color, d1.age, d1.sex);//d1信息:花花,黄色,1,M
    printf("d2信息:%s,%s,%d,%c\n", d2.name, d2.color, d2.age, d2.sex);//d2信息:(null),,0,
    printf("d3信息:%s,%s,%d,%c\n", d3.name, d3.color, d3.age, d3.sex);//d3信息:黑云,黑色,3,G

    return 0;
}

第三种 嵌套struct写法

struct Study {
    char studyContent[20];//学习内容
};
struct Student {
    char *name;
    int age;
    struct Study study;
    struct Play {
        char *playContent;//玩的内容
    } play;
};

void studentTest() {
    struct Student student = {"张三", 18, {"学习Android"}, {"玩LOL"}};
    printf("student:%s,%d,%s,%s", student.name, student.age, student.study.studyContent, student.play.playContent);
    //student:张三,18,学习Android,玩LOL
}

结构体指针 与 动态内存开辟

void pointerTest() {
    struct Student st;
    struct Student *st_p = &st;
    st_p->name = "小妹";//给结构体指针所指的对象成员赋值调用->符号
    printf("st:%s\n", st.name); //st:小妹

    struct Student *stu = malloc(sizeof(struct Student));//堆区开辟一个Student大小的空间
    stu->name = "小小";
    stu->age = 20;
    printf("stu:%s,%d\n", stu->name, stu->age); //stu:小小,20
    free(stu);
    stu = NULL;
}

结构体的数组

struct Cat {
    char name[10];
};

void malTest() {
    //栈区,静态范畴的Cat数组
    struct Cat cats[3] = {{"小黄"},
                          {"中黄"},
                          {"大黄"}};
    printf("cats:%s,%s,%s\n", cats[0].name, cats[1].name, cats[2].name);//小黄,中黄,大黄

    //堆区,动态范畴的Cat数组
    struct Cat *catss = malloc(3 * sizeof(struct Cat));
    strcpy(catss->name, "小黄鸭");//给第1个元素赋值
    strcpy((catss + 1)->name, "中黄鸭");//给第2个元素赋值
    strcpy((catss + 2)->name, "大黄鸭");//给第3个元素赋值
    printf("catss:%s,%s,%s\n", catss[0].name, catss[1].name, catss[2].name);//小黄鸭,中黄鸭,大黄鸭

    free(catss);
    catss = NULL;
}

结构体与结构体指针 取别名

typedef struct Cat Cat; //用typedef定义别名后,不同开发工具的调用写法可以统一
typedef struct Cat *Cat_;
int main() {
// 之前的写法:要带struct 
//    struct Cat cats[3];
//    struct Cat *catp = malloc(sizeof(struct Cat));
    Cat cats[3];
    Cat_ catp=malloc(sizeof(Cat));
    return 0;
}

另一种写法:声明的时候直接指定别名

typedef struct {//名字写底下
    char *name;
} Ch;

//调用时
Ch *c = malloc(sizeof(Ch));// 结构体指针

//方法声明:
void show(Ch c){//省略struct
}

枚举

enum CommentType {
    TEXT,
    TEXT_IMAGE = 5,
    IMAGE
};

void showComment() {
    enum CommentType type1 = TEXT;
    enum CommentType type2 = TEXT_IMAGE;
    enum CommentType type3 = IMAGE;
    //第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。(没有指定值的枚举元素,其值为前一元素加1)
    printf("showComment:%d,%d,%d\n", type1, type2, type3);//showComment:0,5,6
}

枚举取别名

typedef enum {//在创建的时候直接取别名
    TEXT,
    TEXT_IMAGE = 5,
    IMAGE
} CommentType;

void showComment() {
    CommentType type1 = TEXT;
    CommentType type2 = TEXT_IMAGE;
    CommentType type3 = IMAGE;
    printf("showComment:%d,%d,%d\n", type1, type2, type3);//showComment:0,5,6
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值