请教一个结构体, 指针,还有数组的问题
有一个结构体变量sysstruct{······}sys;现在定义一个指针变量unsignedint*p,p=(unsignedint*)sys;memcpy(&data...
有一个结构体变量sys
struct {······}sys;
现在定义一个指针变量 unsigned int*p,
p=(unsigned int*)sys;
memcpy(&datarecieve[0],&(p[slaveraddress]),30)
最后一句是内存复制语句,我有点困惑的是里面的参数,&(p[slaveraddress])是什么意思,p是指向结构体变量sys的指针,这里突然来一个p[slaveraddress]是什么意思,怎么会有个数组呢,这个数组名怎么会是p呢,困惑,还望高手给予解答,先谢谢啦 展开
struct {······}sys;
现在定义一个指针变量 unsigned int*p,
p=(unsigned int*)sys;
memcpy(&datarecieve[0],&(p[slaveraddress]),30)
最后一句是内存复制语句,我有点困惑的是里面的参数,&(p[slaveraddress])是什么意思,p是指向结构体变量sys的指针,这里突然来一个p[slaveraddress]是什么意思,怎么会有个数组呢,这个数组名怎么会是p呢,困惑,还望高手给予解答,先谢谢啦 展开
2个回答
展开全部
可以的。当指针指向sys时,就把sys的首地址赋值给了p;但赋值语句p=(unsigned int*)sys;中sys前的(unsigned int*)把指针p强制成为无符号int型。这样p的指向是sys,但它却不再具有sys的性质而是具有了unsigned int性质,那么p[slaveraddress]就是从sys的首地址开始,以unsigned int的空间大小为单元(通常是4字节)的第slaveraddress个(从0开始数)元素。可能还没有理解,举个例子:int a[10]={1,2,3,5},*p=a;,那么p[0]和a[0]等价=1、p[3]和a[3]造价=5。就是说一个指向具体的指针,可以当数组的首地址用!
追问
谢谢你的回答,那假如说sys的结构体成员如下:
struct
{
unsigned int a;
char b[8]
unsigned long c;
unsigned d;
} sys;
int *p;
p=(unsigned int*)sys;
那p[3]是不是等价于 sys.c 呢,请赐教
追答
对。因为a是4字节,是p[0];b有8个字节,是这p[1]和p[2];c也是4字节,刚好是p[3]……
不过有个问题要注意一下:那就是你这里结构体内部的变量的字节数的排列刚好没有空闲的,是一个接一个的,而实际上有时如果某个变量所占字节数不是4的倍数,那就要进行所谓的“对齐”排列,把不是4的倍数的变量扩展成4的倍数,据说这样可以提高访问时效。而且还与编译器有关,有的编译器很“聪明”,会把两个双字节short型变量当一个只占4个字节而不是8个,但有的编译器却傻到让它们占8个;如果是其中有一个3字节的数组,那当然只好占4字节了……
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询