访问结构体的几种方式一 直接访问,指针访问,偏移访问
实验代码
#include <stdio.h>
#pragma pack(1)
struct mystruct {
unsigned char age;
unsigned char sex;
unsigned char *item;
};
int main()
{
struct mystruct st;
st.age = 1;
st.sex = 1;
st.item = "hello";//指向了 静态存储区
printf("st.age:%d\n", st.age);
printf("st.sex:%d\n", st.sex);
printf("st.item:%s\n", st.item);
//使用指针形式来访问内存空间 间接访问
struct mystruct *pst = &st;
printf("pst.age:%d\n", pst->age);
printf("pst.sex:%d\n", (*pst).sex);
printf("pst.item:%s\n", pst->item);
//使用偏移来访问结构的数据内容
/*
打印结果显示存在内存对齐的情况
struct mystruct age offset:0
struct mystruct sex offset:1
struct mystruct item offset:4
1. 通过VS项目配置设置 --》 c/c++ --> 代码生成 --》结构体成员对齐 默认--》 1字节
2. 或者通过程序控制 #pragma pack(1) ,在#pragma pack(1) 声明之下的代码端说明的结构体生效当前的对齐方式
struct mystruct age offset:0
struct mystruct sex offset:1
struct mystruct item offset:2
*/
//0地址使用(struct mystruct *)强制类型转换取成员再转换成地址(起始地址是0 所有元素地址就是偏移量) 整个过程不使用指针访问内存只是在操作结构体指针变量的解析
int offset1 = (int)&(((struct mystruct *)0)->age);
int offset2 = (int)&(((struct mystruct *)0)->sex);
int offset3 = (int)&(((struct mystruct *)0)->item);
printf("struct mystruct age offset:%d\n", offset1);
printf("struct mystruct sex offset:%d\n", offset2);
printf("struct mystruct item offset:%d\n", offset3);
system("pause");
return 0;
}