结构体的介绍

结构体的介绍

  • 1、结构体基本知识
  • 2、结构体内存大小的计算(结构体内存对齐)
    • 2.1 计算结构体大小的方法
    • 2.2 求嵌套式结构体的内存大小
  • 3、结构体传参
  • 4、位段

1、结构体基本知识

结构体类型、成员、变量、初始化、指针、结构体的嵌套以及值的修改

#include 
typedef struct B
{
	char name1[20];
	float price;
	char author[20];
}B;

struct Stu
{
	char name[20];
	float height;
	double weight;
	int age;  //name、 height、 weight 、age 等均为结构体成员
	B b1;
};

int main()
{
	B b1 = {"鹏哥C语言",50.0,"鹏哥"};  //结构体的初始化
	struct Stu s1 = {"pengpeng",180.0,70.50,18,{"鹏哥C语言",50.0,"鹏哥"} }; //s1为结构体变量,此步为结构体的初始化。
	
	printf("%f\n",s1.b1.price);//结构体变量初始值打印
	s1.b1.price = 60.0; //修改结构体变量的值
	printf("%f\n", s1.b1.price);
	
	struct Stu* p1 = &s1; //p1 为结构体指针
	p1->b1.price = 45.0;
	printf("%f\n", s1.b1.price);

	return 0;
}

2、结构体内存大小的计算(结构体内存对齐)

结构体内存对齐 —优势:1、便于硬件进行访问;2、相比于未内存对齐的情况,内存对齐的数据访问更快。

2.1 计算结构体大小的方法

(遵循结构体内存对齐原则)[vs环境中 默认对齐数为:8]
1,将第一个成员类型大小,与默认对齐数比较,选取小的数为对齐数。第一个成员在内存中放置在结构体地址的零偏移处。
2,接下来的成员,依次将其类型大小与默认对齐数比较,选取较小的数为对齐数。成员在内存中放置的偏移处编号需为对齐数的整数倍。
3,结构体内存的大小需为:各类型成员中对齐数最大值的整数倍。
(因此,在构建结构体变量时,想要节省内存空间,需要将类型小的成员放置在一起)

#include 
 struct Stu
{
	char n; 
	int a;
	float h;
	double w;
}s1;

 int main()
 {
	 printf("%d\n", sizeof(s1));
	 return 0;
 }

2.2 求嵌套式结构体的内存大小

嵌套式结构体内存的大小需为:各类型成员中对齐数(包括被嵌套结构体的对齐数,是该结构体内各成员对齐数的MAX)最大值的整数倍。

#include 
 struct Book
 {
	 char a;//对齐数为:1
	 int b; //对齐数为:4
 }b1;

 struct Stu
 {
	 char n;//对齐数为:1
	 int a; //4
	 float h;//4
	 struct Book b1;//4
 }s1;

 int main()
 {
	 printf("%d\n", sizeof(s1));
	 //20
	 return 0;
 }
 

3、结构体传参

#include 
struct S
{
	int data[1000];
	int num;
};
struct S s = { {1,2,3,4}, 1000 };

//结构体传参
void print1(struct S s)
{
	printf("%d\n", s.num);
}

//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);
}

int main()
{
	print1(s);  //传结构体
	print2(&s); //传地址(更好)—优势:1、系统处理速度更快。2、不需要压栈,节省内存空间。
	return 0;
}

4、位段

位段:一种特殊的结构体类型(在特定场景下,可以节省空间)
与结构体的区别:1、位段的成员必须是int\  signed int\  unsigned int 或者 char类型 。
               2、位段的成员名后边有一个冒号和一个数字。
#include 
struct AA //结构体
{
	int a; 
	int b; 
	int c;
	int d;
}; //所占空间为:16byte

struct A //位段
{
	int a : 2; //a所占的内存空间为 2个bit
	int b : 5; //b所占的内存空间为 5个bit
	int c : 10;
	int d : 30;
}; //所占空间为:8byte

int main()
{
	printf("%d\n", sizeof(struct AA));
	printf("%d\n",sizeof(struct A));

	return 0;
}

位段的内存分配(在Vs环境下分析);
1、位段的成员可以是int\signed int\unsigned int 或 char类型的。
2、位段上的空间是按照需要以4个字节(int)或1个字节(char)方式来开辟的。
3、位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避开位段。

你可能感兴趣的:(c++,c语言,开发语言)