结构体 struct
1.结构体基本用法
1.1 定义
结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。
使用结构体的好处:
结构体的使用为处理复杂的数据结构(如链表等)提供了有效的手段。
为函数间传递不同类型的数据提供了方便。
1.2结构体定义格式
struct 结构体名
{
数据类型 成员变量名1;
数据类型 成员变量名2;
数据类型 成员变量名3;
...
};
举例:
struct student
{
char name[32];
int age;
float score;
};
定义了一个名字叫student的结构体数据类型,里面成员有三个分别是name,age和score。
1.3结构体变量
1.3.1 概念
通过结构体类型定义的变量
1.3.2 定义格式
struct 结构体名 变量名;
1.3.3 定义结构体变量的方式
先定义结构体,再定义结构体变量
struct 结构体名
{
成员变量;
};
struct 结构体名 变量名;
例如:
struct student s1;
定义结构体的同时定义结构体变量
struct 结构体名
{
成员变量;
};
1.3.4 结构体变量赋值
先定义一个结构体:
struct student
{
char name[32];
int id;
int age;
};
定义结构体变量时直接使用花括号赋值
struct student s1 = {"xiaoming",1,18};
定义结构体用点等法赋值
struct student s2 =
{
.name ="xiaofang",
.id = 2,
.age =18
};
定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符.
struct student s3;
s3.id=3;
s3.age=19;
strcpy(s3.name, "xiaowang");
1.3.5 访问结构体成员变量
通过.访问: 结构体变量名.成员变量名
#include <stdio.h>
#include <string.h>
struct student
{
char name[32];
int id;
int age;
} s1, s2; //定义结构体类型student的同时定义结构体变量s1和s2
int main()
{
struct student s3 = {"xiaoliu", 1, 19}; //用struct student类型定义变量s3的同时给每个成员赋值
struct student s4 = {
.name = "xiaozhang",
.id = 2,
.age = 18};
struct student s5; //先定义结构体变量s5, 然后访问每个成员的方式赋值
s5.id = 3;
s5.age = 290;
strcpy(s5.name, "yaojing");
printf("%s %d %d\n", s3.name, s3.id, s3.age);
printf("%s %d %d\n", s4.name, s4.id, s4.age);
printf("%s %d %d\n", s5.name, s5.id, s5.age);
}
1.4重定义typedef
定义结构体的同时重定义
先定义结构体,然后重定义
2.结构体数组
2.1概念
结构体类型相同的变量组成的数组
2.2 定义格式
定义结构体的同时定义结构体数组先定义结构体,然后定义结构体数组
struct student
{
int id;
int age;
};
struct student s[5];
2.3初始化
定义结构体数组同时赋值struct student
{
int id;
int age;
};
struct student s[3] = {
{1, 19},
{2, 20},
{3, 18}};
2.4 结构体数组输入输出(for循环)
#include <stdio.h>
#include <string.h>
struct student
{
char name[32];
int id;
int age;
};
int main()
{
struct student s[3];
for (int i = 0; i < 3; i++)
scanf("%s %d %d", s[i].name, &s[i].id, &s[i].age);
for (int i = 0; i < 3; i++)
printf("%s %d %d\n", s[i].name, s[i].id, s[i].age);
}
3.结构体指针
3.1 概念
指向结构体变量的指针
3.2定义格式
struct 结构体名 *结构体指针名;
3.3 结构体指针所指变量的成员赋值
通过指向结构体变量的指针间接的去访问其中的成员:
格式: 指针变量名 -> 成员变量名
p->id =1;
p->age =19;
strcpy(p->name,"li");
或者:(*p).id=2; //不常用
3.4 大小
本质还是指针,8字节。(32位系统4字节)
3.5 结构体内结构体
如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量
4结构体大小以及对其原则
4.1 结构体大小可以用sizeof得出
sizeof(struct 结构体名);
或者
sizeof(结构体变量名);
结构体数组: 结构体类型大小*元素个数
sizoef(数组名);
4.2 字节对齐原则
例如:
struct stu
{
char a;
int c;
char b;
}; //sizeof(struct stu) 等于12
struct stu
{
char a;
char b;
int c;
}; //sizeof(struct stu) 等于8
第一个成员在相对于结构体变量起始位置偏移量offset为0的地址处(通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的),以后每个成员按定义顺序依次存放在offset为该数据成员大小的整数倍的地方,只有double类型存放在4的整数倍的地方(比如int在32位机器位4字节,要从4的整数倍开始存储)。
用结构体里面最大的数据类型的大小和8(32位系统和4)进行比较,按照字节数小的为单位开辟空间。
4.3 节省空间原则
为了减少空间浪费,把占用空间小的成员集中到一起。
总体上来说,结构体的内存对齐就是一种用空间换取时间的做法,浪费空间来换取性能上的提升。那在设计结构体的时候,我们既要满足对齐,又要节省空间。
标签:定义,int,age,基础,student,结构,struct From: https://blog.csdn.net/2301_80508045/article/details/140710709