结构体类型
什么是结构体
我们观察现实世界的时候,可以发现很多的东西它都是由不同的部分组合起来的。比如手机由电池、屏幕、芯片等很多个部分组成。同时对于一个电池它又是由很多的其他东西组成。结构体就是把这些东西组合在一起,进行统一的访问和管理。可以理解成是对现实世界的抽象
结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高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
*/
以上就是本期的全部内容了,非常感谢你能看到这里,我们下期见!