目录
1.结构体基本用法
1.1 定义
结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。
使用结构体的好处:
1. 结构体的使用为处理复杂的数据结构(如链表等)提供了有效的手段。
2. 为函数间传递不同类型的数据提供了方便。
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, 变量名2;
例如:
struct student
{
char name[32];
int age;
}s1,s2;
定义了一个叫student结构体数据类型的同时,用该类型定了两个叫s1和s2的变量。
也可以用缺省结构体名:
struct
{
成员变量;
} 变量名;
1.3.4 结构体变量赋值
先定义一个结构体:
struct student
{
char name[32];
int id;
int age;
};
(1)定义结构体变量时直接使用花括号赋值
struct student s1 = {"xiaoming", 1, 18};
(2)定义结构体变量时用点等法赋值struct student s2 =
{
.name ="xiaofang",
.id = 2,
.age =18
};
(3)定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符. 。
struct student s3;
s3.id=3;
s3.age=19;
strcpy(s3.name, "xiaowang");
1.5.3 访问结构体成员变量
通过.访问: 结构体变量名.成员变量名
例子:
#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
给数据类型另起名字
1.4.1 基本用法
例如:
typedef int size_t;
此时:int a; 可以写成 size_t a;
总而言之,用数据类型定义变量时变量名写在哪,用typedef重命名时新名字就写在哪然后前面加个typedef就可以了。使用新名字定义变量时直接:新名字 变量名;
1.4.2 定义结构体的同时重定义
typedef struct flower
{
char name[32];
char color[32];
} FLOWER;
FLOWER f1; //等同于 struct flower f1;
struct flower f2;
也可以省略结构体名
1.4.3 先定义结构体,然后重定义
struct flower
{
char name[32];
char color[32];
};
typedef struct flower FLOWER;
FLOWER f1; //等同于 struct flower f1;
2.结构体数组
2.1概念
结构体类型相同的变量组成的数组
2.2 定义格式
1.定义结构体的同时定义结构体数组
struct student
{
int id;
int age;
} s[5];
2.先定义结构体,然后定义结构体数组
struct student
{
int id;
int age;
};
struct student s[5];
2.3 初始化
1.定义结构体数组同时赋值
struct student
{
int id;
int age;
};
struct student s[3] = {
{1, 19},
{2, 20},
{3, 18}};
2.先定义结构体数组,再对数组的每一个元素中的每个结构体成员分别赋值。
#include <stdio.h>
#include <string.h>
struct student
{
char name[32];
int id;
int age;
};
int main()
{
struct student s[3];
strcpy(s[0].name, "xiaoliu");
s[0].id = 1;
s[0].age = 19;
strcpy(s[1].name, "xiaowang");
s[1].id = 2;
s[1].age = 18;
printf("%s %d %d\n", s[0].name, s[0].id, s[0].age);
printf("%s %d %d\n", s[1].name, s[1].id, s[1].age);
}
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 结构体内结构体
如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量
关于结构体总结:
1. 不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用
2. 如果成员变量本身属于另一种结构体类型,用若干个成员运算符.一级级找到最低级的成员变量
3. 可以把成员变量当成普通变量运算
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/thh135/article/details/140771580