我们观察现实世界的时候,可以发现很多的东西它都是由不同的部分组合起来的。比如手机由电池、屏幕、芯片等很多个部分组成。同时对于一个电池它又是由很多的其他东西组成。结构体就是把这些东西组合在一起,进行统一的访问和管理。可以理解成是对现实世界的抽象 结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高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 <stdio.h> #include<string.h> struct Student { char * name; }; int main() { struct Student stu[2]; stu[0] = (struct Student){"泱澈"}; printf("%s\n", stu[0].name); return 0; } 复制代码
指向结构体类型的指针
#include <stdio.h> #include<string.h> 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 <stdio.h> #include<string.h> 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 关键字可以将一种数据类型添加一种别名,例如 typedef int Int;此时Int 等价于 int。在stuck中,我们定义的别名可以直接用于定义变量,等价于 struct 类型名。
#include <stdio.h> #include<string.h> 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 <stdio.h> #include<string.h> enum Gender{ MAN = 1, //不指定值则从 0开始 WOMAN = 2 //不指定值则从上一个定义的值开始递增,为 2 }; int main() { //定义枚举变量 enum Gender g; //枚举变量只可能存在一种值 g = WOMAN; printf("%d\n",g); return 0; } 复制代码
共用体内部可以定义N个变量,但是这个N个变量之间会相互影响。共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员
#include <stdio.h> #include<string.h> 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 */
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!