让你不再害怕结构体-C语言结构体详解

结构体:是一种复合数据类型,多种数据类型集合在一起用来描述事物的整体
与数组类似,数组是都个相同类型的数据合在一起,而结构是多个不同类型的数据合在一起。
结构体归根结底是一种数据类型,由程序员根据需要自由设计的。先设计数据类型:一般结构体的设计写在函数外(头文件中)
struct 类型名
{
类型1 变量名1;
类型2 变量名2;
…………
};
使用设计好的结构类型定义结构对象;
1、 struct 类型名 结构对象名;
2、 访问对象中的成员 对象名 成员变量名
设计好结构类型后,在使用时struct必要加上,但可以通用类型重定义省略struct关键词
结构变量使用堆内存:Struct 结构名* 指针=malloc(sizeof(struct 结构名));
结构指针->成员

计算结构体的字节数:
结构的成员的顺序会影响结构体的字节数,合理的排序成员的顺序可以节约内存
为了让结构变量更快访问成员,成员之间会进行对齐和补丁
对齐:(假定第一个成员从0地址开始)成员地址编号必须是它字节数的整数全部,如果不是则填充一些空字节
补齐:结构字节数必须是它最大成员的整数倍,如果不是则填充一些空字节
注意:Linux系统计算补齐、对齐时,成员的字节数超过4字节时按4字节计算,补和对齐是可以修改的
也可以指定成员所占的字节来节约内存

typedef可以为非常长的类型名重新取一个简短的名字

typedef unsigned int size_t;
在stdint.h头文件中在大量类型重定义
typedef unsigned char uint8_t
typedef unsigned short uint16_t
typedef unsigned int uint32_t
typedef unsigned long long uint64_t
typedef 也可以对结构体起一个简短的名字 typedef struct Student Student;
一般在结构设计时就进行类型重定义
typedef struct Student
{

}Student;
或者
typedef struct //结构体可以没有名字,匿名结构体,不建议这样,特殊场景不行(实现数据结构时)
{

}Student;
结构体要当做一个整体来使用,否则会更麻烦,例如可以为结构的显示封装出一个函数
当使用结构体变量为函数参数时,优先选择传递函数指针,否则就会拷贝整个结构体变量(效率低)
通过结构指针访问结构成员:Student* stup;
stup).name; // .的级别要高于
stup->name;
使用结构指针会造成结构对象被意外修改的风险,可以对结构指针加const来保护结构对象。
const Student* stup;
结构对象的初始化:struct 类型名 结构对象名={成员初始值…};
初始化的顺序要与结构体设计师的成员顺序一致
可以只初始化一部分,剩余的补0。
可以不按顺序初始化,但需要在初始化列表中指定成员名。
struct 类型名 结构对象名={.成员名=成员初始值};
结构对象既然是一种类型数据,也就可以定义结构数组。struct Student stu[100];//定义100个结构对象
stu[1].成员

由于结构体字节数比较多,一般不存储在栈内存中,而是存储在堆内存;
Student* stup=malloc(sizeof(Student));
定义结构数组;
Student* stup=malloc(n,sizeof(Student));

计算结构体的字节数:
注意:结构体成员的顺序会影响结构体的字节数。编译器为了访问结构体成员时速度能更快,对成员的排列进行了补齐和对齐
对齐:编译器规定成员内存起始地址必须时它自身大小的整数倍,如果不是则空着使用后面的地址
补齐:结构体的总字节数必须是它最大成员的整数倍,如果不够则空一些字节来保障

注意:在计算对齐和补齐时Linux超过4字节按照4字节来计算,而windows系统按规定计算
结构体中可以有指针、函数指针、但不可以有函数

C++的结构体中可以有成员是函数,但C的结构体中不可以有函数
结构体的成员是指针:需要在定义结构体对象后,再让它指向一个有效的内存空间

结构体对象之间可以直接赋值,结构体成员赋值只有初始化才能使用大括号批量赋值,定义结束后,就只能单个赋值。
Student stu ={“hehe”,‘m’,1234,750};
stu ={“haha”,‘w’,1234,750};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值