返回信息流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菜鸟,各位勿喷,,谢谢
这是一条镜像帖。来源:北邮人论坛 / cpp / #75297同步于 2013/11/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于结构体疑惑
HFlyaway
2013/11/20镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
你没理解指针。
可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型?
原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。
理解以上内容就很好解释了,对一个指针p,执行p++,p它到底移动了多长字节的距离呢?移动的距离刚好是其指向类型的字节数。比如p指向int,则p++则相当于p移动了4个字节的地址值。你的错误就在于想当然的认为p+4即往p移动了4个字节,其实它移动了4*12个字节
【 在 kuhu 的大作中提到: 】
: 你没理解指针。
: 可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型?
: 原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。
: ...................
谢谢啊!!感觉醍醐灌顶!!
【 在 kuhu 的大作中提到: 】
: 你没理解指针。
: 可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型?
: 原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。
: ...................
还有一个疑问!内存地址1310540 到1310541 是相差一个字节码?
【 在 kuhu 的大作中提到: 】
: 你没理解指针。
: 可以先思考这个问题,对所有指针而言,它的值都是内存地址,是一个固定的长度,但是声明指针时为什么还要声明它指向的类型?
: 原因在于如果你不告知系统指针指向的是什么类型,它就无法正确读取。指针的值即地址只能告诉你它指向内容的首地址在哪,但如果不告诉你它究竟要读多长(究竟是读一个字节表示char,还是读4个字节表示int等),你仍然无法用正确的方式读取正确的内容。
: ...................
thanks!