什么是结构体?
结构体是一种数据类型(结构),具体点讲,结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量(内置类型)、数组、指针,甚⾄是其他结构体。
结构体的声明和定义
结构体的声明:用于告诉编译器有一个新的数据类型存在但并不分配内存空间 。我们一般把声明放在全局范围内,当然情况不同放的位置也不同。 |
struct tag
{
member-list;(成员列表)
};
struct是关键字,tag:标签(结构体的名字)。
struct stu
{
char name[10];
float score;
};//声明结构体但并不分配内存空间
结构体的定义则是在声明的基础上创建结构体变量,此时编译器会为变量分配内存。 |
定义和初始化的两种方式
struct stu
{
char name[10];
float score;
}s1;//声明并定义结构体变量
struct stu s2;//声明后定义变量
struct stu s3 = {"zhangti",99};//按成员变量的顺序初始化
struct stu s4 = {.name = "lisan",.score = 60} ;
//用操作符'.'访问成员变量,.name == char name[20]
struct Node
{
int data;
struct stu s5;
struct Node* next;//结构体成员变量为结构体类型
}n1 = {10,{"zhangsan",90},NULL}//结构体嵌套初始化
小结:结构体的声明就是告知编译器有一个新的数据类型,结构体的定义就是用结构体类型创建变量。
结构体成员的访问
直接访问
使用方式:结构体变量.成员名
#include <stdio.h>
struct point
{
int x;
int y;
int z;
};
int main()
{
struct point p1 = { 0,0,0 };
printf("%d %d %d", p1.x, p1.y, p1.z);
return 0;
}
间接访问
使用方式:结构体指针->成员名
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct point
{
int x;
int y;
int z;
};
int main()
{
struct point p1 = { 0,0,0 };
struct point* ptr = &p1;
ptr->x = 1;
ptr->y = 1;
ptr->z = 1;
printf("%d %d %d", p1.x, p1.y, p1.z);
return 0;
}
结构体的大小
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
这个结果与你想的一样吗?为什么会是12呢?
想要弄明白就需要了解对齐规则。
对齐规则
1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处 (结构体成员的首地址位于结构体变量的启始位置)
2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。(其他成员变量的首地址位于是对齐数整数倍的地址处)
对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。 VS 中默认的值为 8
-Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
依据此规则分析一下输出12的原因:
结尾:初学结构体,此文章必有诸多不足,敬请指教。另外此文会持续更新的哟。