C语言基础——如何抽象世界
互联时代
结构体类型
什么是结构体
我们观察现实世界的时候,可以发现很多的东西它都是由不同的部分组合起来的。比如手机由电池、屏幕、芯片等很多个部分组成。同时对于一个电池它又是由很多的其他东西组成。结构体就是把这些东西组合在一起,进行统一的访问和管理。可以理解成是对现实世界的抽象 结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高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 struct 与 struct 的区别
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;}
enum 枚举
什么是枚举
枚举就是将我们数据可能存在的结果有限个的罗列出来。比如一个人的性别不是男就是女。不会出现其他的值。这个时候我们就可以使用枚举来代表
语法示例
#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;}
union 共用体
什么是共用体
共用体内部可以定义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*/
赞 (0)