定义
结构体是一种构造数据类型,其将不同的数据类型整合起来,形成一个自定义的数据,类似于
JavaScript中的类,不同的是,不能够定义函数;
1 | // 结构体是一种构造数据类型 |
声明变量
已创建的结构体的声明有两种方式,一种是在定义时直接声明,一种是通过”.”操作符访问,并赋值;
1 | // 初始化结构体 |
创建结构体的方式
方式1:创建的同时,为结构体声明变量;1
2
3
4
5
6// 定义结构体同时声明Human、man成员变量
struct Human{
int age;
char* name;
char sex[3];
} Human,man = {10,"coco","man"};
方式2:创建匿名的结构体;1
2
3
4
5
6
7// 匿名结构体
// 匿名结构体必须为其创建变量
// 用来控制结构体变量的个数(因为变量在声明时就必须创建,实现单例效果)
struct{
char name[10];
int age;
}m1,m2;
匿名结构体可以实现Java中类似的单例效果!
结构体嵌套
结构体支持嵌套,既可以是定义时嵌套,也可以是声明时嵌套;
定义时嵌套:1
2
3
4
5
6struct Stu{
int age;
struct Tea{
int age;
} t;
};
声明时嵌套:1
2
3
4
5
6
7
8
9
10struct Teacher{
char name[20];
};
// 方式1
struct Student{
char name[20];
int age;
struct Teacher t;
};
结构体内存大小
结构体虽然是多种数据类型的集合,但其占用内存大小并不一定是所有数据类型的总和,而是大于
等于总和;
1 | struct StructSize{ |
这个结构体的内存不是int+double = 4+8=12,而是要根据最大的数据类型来定,其内存大小必须
是能够整除最大的数据类型的最小值,即必须能够整除double,所以必须再加上4等于16;1
2
3
4
5struct StructSize{
int age;
int height;
double weight;
};
这个数据结构内存大小为int + int + double = 16,刚好能够整除double,所以是16;
这样设计的目的是为了让访问数据的跨度保持相同,提高访问数据的效率;
结构体指针
结构体指针能够让我们更加方便的访问其中的数据;
1 | // 方式1 |
通过指针快捷的遍历结构体:1
2
3
4
5
6
7
8
9
10
11
12
13
14// 遍历结构体数组
struct Student s[2] = { {10,"lili"}, {20,"huahua"} };
// 采用数组遍历的方式比较麻烦
int i = 0;
for (; i < sizeof(s) / sizeof(struct Student); i++){
printf("%s,%d\n", s[i].name, s[i].age);
}
// 采用指针遍历
struct Student* ps = s;
for (; ps < s+2; ps++){
printf("%s,%d\n", ps->name, ps->age);
}
结构体实现类
C语言是面向过程编程的,但很多时候需要借鉴面向对象的思想,而结构体+指针,能够让我们模拟出
类的效果。首先通过函数指针,能够实现类方法的效果,而为结构体再定义一个指针别名,则能够
模拟类实例在参数传递时是引用传递的效果,因为结构体在参数传递时是通过值传递的;
1 | // 定义结构体和指针的别名 |