本文共 3846 字,大约阅读时间需要 12 分钟。
我们观察现实世界的时候,可以发现很多的东西它都是由不同的部分组合起来的。比如手机由电池、屏幕、芯片等很多个部分组成。同时对于一个电池它又是由很多的其他东西组成。结构体就是把这些东西组合在一起,进行统一的访问和管理。可以理解成是对现实世界的抽象 结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。
struct 数据类型名{ //结构体数据成员列表};
示例
struct Student{ char * name; char * gender; char * mail; int age;};
声明结构体变量
方式一
struct Student student;
方式二
struct Student { char name[10]; char * gender; char * mail; int age;} stu;
方式三
struct { char * name; char * gender; char * mail; int age;} stu;//之后无法再继续定义变量
结构体变量的初始化
结构体定义时初始化
struct Student{ char name[10]; char *gender; char *mail; int age;} student = {"泱澈", "男", "2633218009@qq.com", 21};
变量定义时初始化
struct Student stu;// 此时需要进行类型转换stu = (struct Student){ "泱澈", "男", "2633218009@qq.com", 21 };//部分初始化struct Student stu = {.name = "泱澈"};
单个进行赋值
//对数组类型的数据不能直接赋值 例如 stu.name = "泱澈"; strcpy(stu.name,"泱澈"); stu.age = 21; stu.gender = "男";
结构体变量的使用
我们使用 变量.成员字段 来使用结构体的数据成员
strcpy(stu.name,"泱澈"); stu.age = 21; stu.gender = "男"; stu.mail = "2633218009@qq.com"; printf("%s\n", stu.name); printf("%s\n", stu.gender); printf("%s\n", stu.mail); printf("%d\n", stu.age);
语法定义
struct Student{ char * name; }stu[5];
使用上与单个结构体变量相同,在数组中需要加上在数组中的下标
使用示例
#include#include struct Student{ char * name;};int main(){ struct Student stu[2]; stu[0] = (struct Student){"泱澈"}; printf("%s\n", stu[0].name); return 0;}
指向结构体类型的指针
使用示例
#include#include struct Student{ char * name;};int main(){ struct Student stu = {"泱澈"}; struct Student * p; p = &stu; printf("%s\n", (* p).name); printf("%s\n", p->name); return 0;}
一个结构体当中可以包含其他类型的结构体,当中自身当中不能包含相同类型的结构体,但是可以包含执行自身的指针
使用示例
#include#include struct gender{ char * ch;};struct Student{ char * name; struct Student * s; struct gender gen;};int main(){ struct gender gen = {"男"}; struct Student stu = {"泱澈",NULL}; struct Student student = { "泱澈", &stu, gen }; printf("%s\n", student.name); printf("%s\n", (student.s)->name); printf("%s\n", student.gen.ch); return 0;}
结构体变量在作为参数传递的时候使用的是值传递
typedef struct 与 struct 的区别
typedef 关键字可以将一种数据类型添加一种别名,例如 typedef int Int;此时Int 等价于 int。在stuck中,我们定义的别名可以直接用于定义变量,等价于 struct 类型名。
使用示例
#include#include struct gender{ char * ch;};typedef struct Student{ char * name; struct Student * s; struct gender gen;} Stu;int main(){ struct gender gen = {"男"}; struct Student stu = {"泱澈",NULL}; struct Student student = { "泱澈", &stu, gen }; //使用新定义的类型名 定义指针变量 等价于 struct Student Stu * s = &student; printf("%s\n", (*s).name); printf("%s\n", ((*s).s)->name); printf("%s\n", (*s).gen.ch); return 0;}
枚举就是将我们数据可能存在的结果有限个的罗列出来。比如一个人的性别不是男就是女。不会出现其他的值。这个时候我们就可以使用枚举来代表
#include#include enum Gender{ MAN = 1, //不指定值则从 0开始 WOMAN = 2 //不指定值则从上一个定义的值开始递增,为 2};int main(){ //定义枚举变量 enum Gender g; //枚举变量只可能存在一种值 g = WOMAN; printf("%d\n",g); return 0;}
共用体内部可以定义N个变量,但是这个N个变量之间会相互影响。共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
#include#include union Data{ int a; char b; short c;};int main(){ union Data d ; d.a = 46; printf("%d\n",d.a); printf("%c\n",d.b); printf("%d\n",d.c); printf("-----\n"); d.b = 'a'; printf("%d\n",d.a); printf("%c\n",d.b); printf("%d\n",d.c); printf("-----\n"); d.c = 47; printf("%d\n",d.a); printf("%c\n",d.b); printf("%d\n",d.c); return 0;}/* 运行结果: 46 . 46 ----- 97 a 97 ----- 47 / 47*/
以上就是本期的全部内容了,非常感谢你能看到这里,我们下期见!
转载地址:http://otden.baihongyu.com/