C++ 结构体

文章概述

  1. 结构体的定义;
  2. 定义结构体变量的几种方式;
  3. 访问结构体变量以及结构体变量赋值;
  4. 定义结构体变量,编译器会分配多大内存的空间。

结构体的定义

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位。

猜你喜欢

转载自blog.csdn.net/wue1206/article/details/80995869