C++的各位大神,求教一个菜鸟级的问题,为什么p = p+2 后地址不是0x003E237A

如题所述

这和语言定义的指针运算法则有关系。对于指针的加法就是数字乘上类型大小。具体规则引用一篇文章的部分:
在C语言中,指针和数字进行运算(仅限加减),其规定的语法规则为:
指针 +/- 整数
(结果仍然为指针)
编译器会自动根据指针类型对运算进行调整,实际结果是数字乘类型大小的偏移量。
所以,对于char类型来说,p++指向下一个char;而对float来说,并不会指向float内部的第二个字节。

里面还有一个细节,变量fl 在变量c 之后,而地址上fl 地址在c
地址之前。这是因为,两个变量是在函数中声明的,存储在堆栈上,而在C中,堆栈的使用是从高地址向低地址使用的,所以后声明的变量地址在低地址。一般来
说,C和C++程序的堆栈大小为2M(当然了,不同的编译器可能实现不同,比如,早起编译器以及嵌入式的编译器可能只有几十K)。
在C语言中,指针还有一种运算,语法规则是:
指针1 - 指针2
(结果为有符号整数类型,int)
注意,只有减法,没有其它运算;而且,指针1和指针2指向同一个数组时,才允许进行计算;结果是两个指针的地址差除以元素类型长度。
比如,char cs[]中,
&cs[i] - &cs[j] = i - j,其中&cs[i] - &cs[j] 是 i-j 个字节,因为char 类型长度是1字节
float f[]中,&f[i] - &f[j] = i - j,其中&f[i] - &f[j] 是4×(i-j)个字节,因为float类型长度是4字节
如果i>j,结果为正数;否则,结果为负数。
不同数组间的指针不允许运算,结果是未定义的。
除此之外,C语言还规定,指针间可以进行关系运算,规则是:
1)指向同一数组的指针,可以进行 >、>=、<、<= 运算,以比较指针的前后顺序。
2)任意指针,都可以进行 ==、!= 运算,以比较指针是否指向同一位置。
对于任意指针,如果不指向同一数组,1)中的运算结果在标准中是未定义的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-24
因为p = p+2之前做了p--操作,使得P又指回了0x003E2378
而一个short类型的长度又是2,因此p = p+2是使得P后移两个short,则移动的长度为4,
所以p = p+2指向的地址为0x003E2378+0x00000004=0x003E237c
第2个回答  2013-02-24
指针运算加的是偏移量不是值,这也是为什么指针要定义类型的原因。。。。一个short int类型指针+1,意思是指向下一个short int,而不是地址+1,因为一个short int两个字节,所以地址是+2*2=4;如果你的类型长度是100,比如某struct长度是100,那该类型指针+1,是地址+100本回答被提问者采纳
第3个回答  2013-02-24
他看似加2,实际上加的是 2倍的 那个数据类型的长度。看来你用的环境下,short int 是2字节。int一般是4字节。
你看p++不就是 p+1吗?p+1 得 37A,再加1, 不就是37C喽。
第4个回答  2013-02-24
这里的2,不是简单的数值的2,是两个sizeof(usi)的长度。也就是说,加的2其实是4
相似回答
大家正在搜