1、结构体基本知识
结构体类型、成员、变量、初始化、指针、结构体的嵌套以及值的修改
#include <stdio.h>
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 <stdio.h>
struct Stu
{
char n;
int a;
float h;
double w;
}s1;
int main()
{
printf("%d\n", sizeof(s1));
return 0;
}
2.2 求嵌套式结构体的内存大小
嵌套式结构体内存的大小需为:各类型成员中对齐数(包括被嵌套结构体的对齐数,是该结构体内各成员对齐数的MAX)最大值的整数倍。
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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语言中的结构体概念,包括结构体的基本知识如类型定义、初始化、指针操作和嵌套结构体。讨论了结构体内存大小的计算,强调了内存对齐的重要性及其计算方法。此外,提到了结构体在函数传参中的应用,并对比了直接传递和传递指针的优劣。最后,文章探讨了位段这一特殊结构体类型,以及其节省空间的特点和限制。
1万+





