文章概述
- 结构体的定义;
- 定义结构体变量的几种方式;
- 访问结构体变量以及结构体变量赋值;
- 定义结构体变量,编译器会分配多大内存的空间。
结构体的定义
a. 结构体出现的背景
为了表示一些复杂的数据,普通的基本变量无法满足需求。
b. 结构体:表示不同类型变量的集合。通常将一组密切相关的信息组合起来表示一个对象。
c. struct用来声明一个结构体的类型。结构体中的变量被称为成员。
struct Student
{
//学生的姓名
char name[200];
//学生的学号
int id;
};
定义结构体变量的几种方式
a. c语言定义结构体变量的方式:
struct Student one;
b. C++定义结构体的方式(以下全部是C++的方式):
Student two;
c. 定义结构体的同时定义结构体的变量
struct Student
{
int id;
char name[200];
}three;
d. 结构体中只定义一个变量
struct
{
int id;
char name[200];
};
e. 结构体中定义一组变量
struct Student
{
char name[200];
int id;
}ftr[3] = {"张三",1,"李四",2,"王五",3};
d. 结构体中定义指向结构体变量的指针
struct Student
{
char name[200];
int id;
}* str;
str->name ="张三";
str->id ="李四";
访问结构体变量以及结构体变量赋值
struct Student
{
char name[200];
int id;
};
//创建变量
Student one;
//使用成员运算符.获得变量中的成员
one.id = 8;
//结构体的变量可以使用赋值运算符
Student two;
two = one;
定义结构体变量,编译器会分配多大内存的空间
a. 只有定义结构体变量的时候, 编译器才会分配内存。
b. 分析下面结构体变量所占用的内存:
struct Student
{
double ages;
char sex;
int age;
};
Student one;
我们通过变量所占字节相加,获得one所占的字节数double+char+int,最后的字节数为13。但是, 我们通过sizeof()得到的是16,为什么会这样? 这里涉及到结构体的字节对齐问题, 编译器为结构体变量分配空间,保证下一个成员的偏移量应该是该成员数据类型长度的整数倍。(下一个就是第二个成员变量开始)。
分析one在内存的简单布局,如果从0开始数。double类型0,1,2,3,4,5,6,7; char类型8;int类型从9开始,但是偏移量9不能对4整除,所以继续移动直到12的时候,才会发现可以整除12,13,14,15。总共的话是8+1+3(为了整除而偏移)+4 = 16。
有的时候,需要在一个字节中表示多项内容。比如描述IP协议首部时,首部长度占4位,版本号占4位,怎么定义描述IP协议的结构体?
C++提供了位域,允许用户单独访问一位数据。看下面的代码(描述的是IP协议的首部和版本号):
struct HeadIP
{
unsigned char headerlen : 4; //表示的是首部长度占4位
unsigned char version : 4; //表示的是版本号占4位
};
headerlen本来是占1个字节,也就是8位。但是通过位域符号":"和4,headerlen占4位。