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)
4.5 指针与数组的转换_第1张图片

rel_addr2 相邻之间相差sizeof(pakage_t)
4.5 指针与数组的转换_第2张图片

整理如下:
4.5 指针与数组的转换_第3张图片
从上可以看出,地址转换到数据,数组加一,地址加整个结构体长度。也就是说地址下标代表整个结构体类型数据

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

	data=abs_addr->head_first;//与下面等价
	data=abs_addr[0].head_first;//与上面等价
	
	data=(abs_addr+1)->head_first;//与下面等价,加1等价与地址+结构体长度
	data=abs_addr[1].head_first;//与上面等价

你可能感兴趣的:(C语言,c语言)