前言
本篇学习结构体和枚举,结构体相当于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
}