结构体
定义:是用于存储不同类型或相同类型的元素的集合
- 与数组的区别
- 数组是一组相同类型元素的集合
- 而结构体可以存放相同或不同类型元素的集合
特点:
允许用户根据自己的需求来创建可用的数据类型
用来处理复杂对象的 相当于java里面的类
定义结构体变量
使用struct关键字
先声明结构体类型,再定义结构体变量
1 | struct 结构体名称 结构体变量1,结构体变量2...; |
声明结构体类型并定义变量
1 | struct 结构体名称{ |
无类型名直接定义结构体类型变量
1 | struct { |
举例
1 | struct Teacher Teacher1,Teacher2; |
1 | struct Teacher{ |
1 | struct{ |
注:
结构体最后的分号一定要写
- 定义结构体变量后,系统会为其分配内存空间
- 区分:对于结构体类型,系统不为其分配内存空间,只对其变量分配相应的内存空间
初始化
形式
1 | struct 结构体名称 结构体变量={内容}; |
直接为结构体变量赋予初值
1 | struct Teacher{ |
为某一个结构体变量成员赋予初值
1 | struct Teacher c={.num=20}; |
其他为未初始化的内容
- 数值型,系统初始化为0
- 字符型,系统初始化为\0
注:
为结构体变量赋予初值时,可以不完全初始化
是为结构体变量初始化,不能为结构体类型初始化
调用结构体成员
- 单个结构体
1 | 结构体变量名.成员名 |
1 | #include <stdio.h> |
但不能使用结构体变量名称来获取整个结构体中所有成员的值
- 嵌套结构体
结构体里的成员可以是另一个结构体
1 | 结构体变量名1.结构体变量名2.成员名 |
只能一级一级的去找到最低级别的成员
注:
- 结构体变量中的成员可以进行各类运算
- 调用结构体时,我们采用“.”这个成员运算符,它的 优先级高于其余的运算符,在计算时,我们首先调用该成员的内容,再进行相关的操作
结构体数组
导入:结构体中可以存放各种类型的元素,当然数组类型的数据也能被存放
应用:对于多个对象的多个数据的运算
声明结构体数组
1 | struct peo{ |
初始化结构体数组
1 | struct peo{ |
结构体数组使用
1 | 结构体数组.成员 |
1 | int i=0; |
结构体指针
指向结构体变量的指针
调用结构体变量中的成员——我们可以为一个函数传入该结构体变量的地址,表示结构体变量成员的第一项的地址,用结构体指针来接收,对该地址解引用后,访问它的属性值(作用与结构体变量一致),即可获取到该结构体变量中的成员
1 | struct Peo { |
指针调用
结构体指针
(*结构体指针变量名).成员名
1
2
3
4
5
6
7
8
9
10
11
12
13#include <stdio.h>
struct Peo{
char name[20];
char gender[5];
char tele[12];
};
int main(){
struct Peo p1={"张三","男","11111111111"};
struct Peo * p = NULL;
P=&p1;
printf("%d",(*p).name);//张三
return 0;
}注:
不能省略*结构体指针变量名两端的括号,否则优先级将会变成先得到结构体变量的地址再调用属性
上述结构体指针的调用可简写为
结构体指针变量名->成员名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <stdio.h>
struct Peo {
char name[20];
char gender[5];
char tele[12];
};
struct Stu {
//结构体嵌套已存在的结构体
struct Peo p;
int num;
float f;
};
void print(struct Peo* pc) {
printf("%s %s %s ",pc->name,pc->gender,pc->tele);//结构体指针->成员变量
}//张三 男 11111111111
int main() {
struct Peo p1= {"张三","男","11111111111"};
print(&p1);
return 0;
}