C语言结构体
结构体
1、结构体的概念:由多个相同或不同的数据类型组成的集合,集合内有多个用来描述的属性。
2、结构体的声名:
typedef struct student{
成员属性列表;
}student_t;
声明的结构体类型是一个新的数据类型。
3、定义结构体类型的变量:
student_t stu; --------》 定义一个结构体类型的变量
student_t stu1; --------》 定义一个结构体类型的指针
student_t stu2[2]; --------》定义一个结构体类型的数组
student_t stu3[2]; --------》定义一个结构体类型的指针数组
student_t (*stu4)[2]; --------》定义一个结构体类型的数组指针
4、对结构体变量的初始化:
(1)、定义的同时进行初始化
student_t stu = {value1,value2,......................};
(2)、先定义,后初始化
student_t stu;
student_t *stu1 = &stu;
(3)、已经初始化的结构体,对另一个相同类型的结构体进行初始化(要求两个结构体类型一致)
student_t stu;
student_t *stu1 = &stu;
student_t stu5 = stu;
5、结构体中成员的访问:
普通的结构体类型变量使用 "."
格式:
结构体变量名 . 成员名;
结构体指针类型变量使用 "->"
格式:
结构体变量指针 -> 成员名;
6、在一个结构体之中是不能在定义一个与自身结构体类型相同的变量,但是可以定义一个与自身结构体类型相同的结构体类型指针。
例如:
typedef struct A1{
int i;
int *j;
struct A1 *L;
//struct A1 H; //结构体里是无法定义一个与它自身结构体同类型的变量的。
}A1_t;
为什么?
因为我们在定义好结构体的成员变量之后,系统会计算这个结构体占用的内存的大小。
但是 H 是一个 struct A1 类型的变量,所以只有在定义好之后才能计算这个结构体占用的内存的大小,
那么我们在定义H时,它的大小又是多少呢? 我们是不知道的。
所以无法在一个结构体中定义一个与结构体类型相同的变量。
因为无论什么类型的指针都占4个字节,所以我们是可以在结构体内,定义一个与结构体同类型的指针。
结构体的内存的对齐的问题
结构体对齐原则:在结构体内,有大于int类型(或有int类型)的数据时,按4字节进行对齐。
如果在结构体内,没有大于int类型的数据时,按最大的那个类型进行对齐
#include <stddef.h>
size_t offsetof(type , member);
功能:计算结构体中指定成员,相对于结构体开始地址偏移的字节个数;
参数:
@type:结构体
@member:结构体成员的地址
返回值:
成功:返回偏移的字节个数。


可以看到字符b占用了两个字节,那是为什么呢?这就是结构体对齐的问题;
点击查看代码
数据类型:
char 1个字节
short 2个字节
int 和 float 4个字节
double 8个字节
指针类型 4个字节
参考案例:08struct.c
#include <stdio.h>
struct aa{
char a;
char b;
char c;
};
struct bb{
char a; // 1
char b; // 1
char c; // 1
// 保留一个字节
short d; // 2
};
struct cc{
char a; // 1
char b; // 1
char c; // 1
// 保留一个字节
short d; // 2
// 保留2个字节
int e; // 4
};
struct dd{
char a; // 1
char b; // 1
char c; // 1
// 保留一个字节
short d; // 2
// 保留2个字节
int e; // 4
double f; // 8
};

浙公网安备 33010602011771号