struct 结构体
来源:互联网 发布:软件侵权的证据 编辑:程序博客网 时间:2024/06/08 17:16
struct 结构体
struct是结构体的关键字,他将一些相关联的数据打包成一个整体,方便使用。
(1)定义结构体
#include<stdio.h>struct infor //struct infor 是标识符,必须整体使用 { char name[50]; //成员变量 char is_male; int age; }; //此处的分号不可以省略 typedef struct infor S;//typedef后面也有一个分号 int main(void){ S s; //定义了一个结构体变量s return 0;}
(2)结构体的初始化
相同类型的结构体相互赋值
用运算符(.)来给各个元素赋值
(3)访问结构体的各元素
#include<stdio.h>struct date{ int a; float b; char c;}S;int main(void){ struct date s; //赋值 s.a = 1; s.b = 3.14; s.c = 2; //用指针来访问结构体里面的各个元素 int *p = (int *)&s; //&s的类型是struct date*类型的,所以此处要强制类型转化。 printf("*p = %d.\n",*p); //此时访问到的是结构体第一个int值 float *p2 = (float *)((float *)&s+1);(==long(&s)+4) //地址值加上多少就是多少,(float *)&s+1此处+1是+sizeof(float) //访问struct里面的float变量 printf("*p2 = %.2f.\n",*p2); return 0;}
(4)结构体数组(给结构体数组赋值和遍历)
main函数主体:
运行结果:
(5)结构体的内存对齐
首先说说为什么要对齐。为了提高效率,计算机从内存中取数据是按照一个固定长度的。以32位机为例,它每次取32个位,也就是4个字节(每字节8个位)。
字节对齐有什么好处?
以int型数据为例,如果它在内存中存放的位置按4字节对齐,也就是说1个int的数据全部落在计算机一次取数的区间内,那么只需要取一次就可以了。如果不对齐,很不巧,这个int数据刚好跨越了取数的边界,这样就需要取两次才能把这个int的数据全部取到,这样效率也就降低了。
内存对齐是会浪费一些空间的。但是这种空间上得浪费却可以减少取数的时间。这是典型的一种以空间换时间的做法。
以下以GCC为例讲解结构体的对齐.
一、原则:
1.结构体内成员按自身按自身长度自对齐。
自身长度,如char=1,short=2,int=4,double=8,。所谓自对齐,指的是该成员的起始位置的内存地址必须是它自身长度的整数倍。如int只能以0,4,8这类的地址开始
2.结构体的总大小为结构体的有效对齐值的整数倍
结构体的有效对齐值的确定:
1)当未明确指定时,以结构体中最长的成员的长度为其有效值
2)当用#pragma pack(n) #pragma pack指定时,以n和结构体中最长的成员的长度中较小者为其值。
3)当用attribute ((packed))指定长度时,强制按照此值为结构体的有效对齐值。
我们来看两个程序理解一下结构体的内存对齐:
(gcc编译器)
结构体A在内存中放的是
0 a1 234 b5 b6 b7 b8 c91011
此时结构体A在内存中放的是:
0 a1 b2 填充3 填充4 c5 c6 c7 c
再来看几个程序理解一下#pragma pack()指定之后的对齐方式。
pragma pack()和#pragma是对齐指令,必须配合使用,表示一个区间,只有在这个区间内的结构体按指定的对齐方式来对齐。
1 指定按1字节对齐
2 指定按2个字节对齐
3 指定按16个字节对齐
此时s的大小为什么不是16而是8?
是因为编译器会将你指定的对齐方式(字节大小)和结构体中最大成员的字节数进行比较,选择两者当中最小的一个是有效对齐方式。当你8已经足够的时候,没必要指定16来存放结构体,浪费空间对吧!
- 结构体(struct) 用法
- 结构体struct module
- 什么结构体 struct
- struct结构体
- struct hostent结构体
- struct hostent结构体
- struct termios结构体
- struct hostent结构体
- 结构体(struct)
- struct termios结构体
- struct device结构体(
- [Matlab]结构体(Struct)
- struct termios结构体
- struct termios 结构体
- struct device结构体
- struct timeval结构体
- struct addrinfo结构体
- struct timeval结构体
- 特征分解和奇异值分解(SVD)
- 机房收费系统——详细设计说明书
- 简单MVP框架(OKHTTP请求数据)
- 【MySQL】---1045-Access denied for user 'root'@'localhost'(using password :YES)
- Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
- struct 结构体
- org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter问题解决
- OkHttp get post请求的封装
- 用单片机实现 websever 网页服务器功能
- KMP算法
- 我在兄弟连学python(2)-----关于返回值
- 爬虫实践练习(爬小说)
- 验证
- 集合小结