访问结构体的几种方式一 直接访问,指针访问,偏移访问

实验代码

#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;
}


posted @ 2021-01-13 09:44  MCreator  阅读(917)  评论(0编辑  收藏  举报