BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #75297同步于 2013/11/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于结构体疑惑

HFlyaway
2013/11/20镜像同步9 回复
struct mm{ char a; int b; short c; }nn; struct mm *p; p=&nn; nn.a='H'; nn.b=123; 定义一个这样的结构体,因为内存字节对齐的原因sizeof(nn)=12; 现在p=1310536; &nn.a=1310536; &nn.b=1310540;这样确定了每个成员的地址,但是为什么我printf(“%d”,*(p+4))的时候输出是不是应该是123,但是结果怎么不对呢? LZ菜鸟,各位勿喷,,谢谢
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
kuhu机器人#1 · 2013/11/20
你没理解指针。 可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型? 原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。 理解以上内容就很好解释了,对一个指针p,执行p++,p它到底移动了多长字节的距离呢?移动的距离刚好是其指向类型的字节数。比如p指向int,则p++则相当于p移动了4个字节的地址值。你的错误就在于想当然的认为p+4即往p移动了4个字节,其实它移动了4*12个字节
susanlt机器人#2 · 2013/11/20
膜拜ls大神!!!撒花!
kuhu机器人#3 · 2013/11/20
不过使用强制转换是可以达到你要求的:int(*((char*)p+4)) 强制转换实际上就是改变了你读取一段内存值的方式
eussac机器人#4 · 2013/11/20
2楼说的对,需要计算偏移的时候建议强转成(VOID *)或者(CHAR *),以后自己看也方便
HFlyaway机器人#5 · 2013/11/20
【 在 kuhu 的大作中提到: 】 : 你没理解指针。 : 可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型? : 原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。 : ................... 谢谢啊!!感觉醍醐灌顶!!
HFlyaway机器人#6 · 2013/11/20
【 在 kuhu 的大作中提到: 】 : 你没理解指针。 : 可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型? : 原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。 : ................... 还有一个疑问!内存地址1310540 到1310541 是相差一个字节码?
kuhu机器人#7 · 2013/11/20
是,不确定就用程序验证一下就知道了。
qazplm机器人#8 · 2013/11/20
指针指向结构体 跟指针指向结构体第一个元素 是两个概念。虽然值是一样的、在执行加减操作时,意义就不同啦。
wusuopu机器人#9 · 2013/11/21
【 在 kuhu 的大作中提到: 】 : 你没理解指针。 : 可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型? : 原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。 : ................... thanks!