
1、结构体的概述
在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一。
在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。
C语言便提供了结构体来解决我们的这种需求,它允许内部的元素是不同类型的。
结构体是用来存放相同类型数据或者不同类型数据的自定义数据类型
2、结构体的定义
struct 结构体名 {
成员变量1;
成员变量2;
...
};
struct student { // 结构体的成员变量
char name[]; // 姓名
char gender; // 性别
int age; // 年龄
double score; // 成绩 };// 分号不能省略
3、结构体变量的定义
第一种方式: 先定义结构体类型,再定义变量
此定义方式与普通数据类型变量的定义方式相同;
struct 结构体名 变量名;
注意: 其中struct 结构名才为数据类型, 单纯的结构名不算作数据类型。
struct teacher {
char name[];
int age;
float height;
}; // 分号不能省略
struct teacher englishTeacher;
第二种方式: 定义结构体类型的同时定义变量
struct teacher {
char name[];
int age;
float height;
} mathTeacher;
其中mathTeacher为变量名。
第三种方式: 直接定义结构体类型变量,省略类型名
struct {
char name[];
int age;
float height;
} chineseTeacher;
其中chineseTeacher为变量名, 此结构体我们称为匿名结构体。
4、结构体的重定义
结构体的重定义方式分为两种:
1) 对已有结构体进行重定义:
typedef struct teacher Teacher;
2) 在创建结构体时, 进行重定义:
typedef struct teacher {
char name[];
int age;
float height;
} Teacher;
5、结构体变量的成员
1) 结构体变量成员的初始化:使用{...}给构造类型赋初始值
Teacher englishTeacher = {“zf”, , 1.70f};
注意:赋值的数值类型和成员变量的类型一一对应
2) 赋值:
1> 先找到结构体变量,再通过“ .” 操作符访问变量的成员,简单数据类型可以直接赋值
englishTeacher.name = tt
englishTeacher.age =
englishTeacher.height = 1.77f
2> 结构体与结构体可以直接赋值
注意:数组是不可以直接赋值的
小技巧: 可以通过把数组作为结构体的成员实现直接赋值。
6、结构体所占内存的计算
1) 最大分配(长度最大的进行分配内存)
2) 内存对齐(对应类型所占字节的倍数进行存放)
struct student {
char name[]; //内存0-20
char gender; //内存21
int age; //内存24-27
double score; //内存32-39
};
图解:
7、结构体嵌套
struct birthday {
int year;
int month;
int day;
};
typedef struct birthday Birthday; struct person {
char name[];
char gender;
Birthday bir;
};
typedef struct person Person;
结构体嵌套时,应注意避免使用结构体本身, 如下写法是错误的:
struct person {
char name[];
struct person per;
};
8、结构体数组
数组的类型是结构体类型,与其他数据类型的数组是一样的,可以参考iOSDay04C语言数组