4.5 指针与数组的转换

typedef struct
{
	unsigned char head_first;                //包头首字节
	unsigned char head_last;                 //包头末字节
	unsigned char ad[5][96][2];
	unsigned char end_first;                 //包尾首字节
	unsigned char end_last;                  //包尾末字节 
} pakage_t; 
typedef struct
{
	unsigned short have;
	pakage_t ph_data;
	unsigned short NVLL;//凑4字节对齐
}save_pakage_t; //1076Byte
	
#define ph_base 	0XC0000000
#define PhotoLoad ((save_pakage_t *) ph_base)


main.c()
{
	uint8_t *p,data;
	uint32_t i;
	uint32_t len_array;
	pakage_t *rel_addr1[100]; //指针数组
	pakage_t *rel_addr2[100]; //指针数组
	pakage_t *abs_addr; 	  //绝对地址
	abs_addr = (pakage_t*)(0XC0010000);
	len_array = sizeof(pakage_t);//len_array= 0X3C4
//PhotoLoad 赋值
	for(i=0;i<100;i++)
	{
		p = (uint8_t*)&PhotoLoad[i].have;
		for(uint16_t j=0;j<sizeof(pakage_t);j++)
		*(p++) = i;
	}
	

	for(uint8_t i=0;i<100;i++)
	{
		abs_addr[i] = PhotoLoad[i].ph_data;		//拷贝数据(将整个ph_data拷贝,地址: 0XC0010002+i*sizeof(pakage_t)
		rel_addr1[i] = &PhotoLoad[i].ph_data;	//指针数组赋值
	  	rel_addr2[i] = &abs_addr[i];					//指针数组赋值
	}
	
	data=abs_addr->head_first;//与下面等价
	data=abs_addr[0].head_first;//与上面等价
	
	data=(abs_addr+1)->head_first;//与下面等价,加1等价与地址+结构体长度
	data=abs_addr[1].head_first;//与上面等价
}

rel_addr1 相邻之间相差sizeof(save_pakage_t)
在这里插入图片描述

rel_addr2 相邻之间相差sizeof(pakage_t)
在这里插入图片描述

整理如下:
在这里插入图片描述
从上可以看出,地址转换到数据,数组加一,地址加整个结构体长度。也就是说地址下标代表整个结构体类型数据

程序中这两组为等价关系:

	data=abs_addr->head_first;//与下面等价
	data=abs_addr[0].head_first;//与上面等价
	
	data=(abs_addr+1)->head_first;//与下面等价,加1等价与地址+结构体长度
	data=abs_addr[1].head_first;//与上面等价
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值