注册 登录
编程论坛 C++教室

求解为什么两个地址相减后并非实际变量的地址值的差

lfe_bccn 发布于 2014-07-17 11:38, 557 次点击
现有疑问,实在是想不明白,烦请各位指教一下。
代码:
#include "iostream.h"
void main()
{
    static char a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    char *p;
    for(p=a[0];p<a[0]+12;p++)
    {
         cout<<p-a[0]<<endl;
         cout<<p<<endl;
         cout<<a[0]<<endl;
    }
}
执行结果(部分):
0
0x0042D710
0x0042D710
1
0x0042D714
0x0042D710
2
0x0042D718
0x0042D710

疑问:p是0x0042D714,a[0]是0x0042D710时,p-a[0]的值为1,为什么不是4?
如果p和a[3][4]更改为char型,并且a[3][4]={'1','2','3','4','5','6','7','8','9','a','b','c'},执行结果(部分)如下所示,为什么p-a[0]的值仍然不变?
0
123456789abc
123456789abc
1
23456789abc
123456789abc
2
3456789abc
123456789abc
3
456789abc
123456789abc
7 回复
#2
wp2319572014-07-17 11:44
p++
#3
lfe_bccn2014-07-17 11:57
回复 2 楼 wp231957
p值的改变我明白,不明白的是p-a[0]的值。如果您知道,麻烦详述,谢谢!
#4
隼hayabusa2014-07-17 14:12
p指向数组元素时,p-a[0]表示的是p和a[0]间数组元素的个数(也包括a[0]),至于内存,根据编译器而定!
#5
wp2319572014-07-17 14:49
以下是引用lfe_bccn在2014-7-17 11:57:43的发言:

p值的改变我明白,不明白的是p-a[0]的值。如果您知道,麻烦详述,谢谢!


p++不就相当于p=p+1  所以他们的差恒定不变  就形成了你例子中的 0 1 2 3 ......
#6
wp2319572014-07-17 14:52
具体可见这个例子:

程序代码:
#include <stdio.h>

int main(void)
{
    char a[]="test";
    char* p=a;
    printf("add:%x  cont:%4s    %4d\n",  p,p,p-&a[0]);
    printf("add:%x  cont:%4s    %4d\n",++p,p,p-&a[0]);
    printf("add:%x  cont:%4s    %4d\n",++p,p,p-&a[0]);
    return 0;
}     
#7
lfe_bccn2014-07-17 16:19
以下是引用隼hayabusa在2014-7-17 14:12:16的发言:

p指向数组元素时,p-a[0]表示的是p和a[0]间数组元素的个数(也包括a[0]),至于内存,根据编译器而定!
谢谢!
#8
lfe_bccn2014-07-17 16:22
以下是引用wp231957在2014-7-17 14:49:12的发言:

 
 
p++不就相当于p=p+1  所以他们的差恒定不变  就形成了你例子中的 0 1 2 3 ......
谢谢您!原来可以不用去考虑p所指向的内存地址值。

[ 本帖最后由 lfe_bccn 于 2014-7-17 16:25 编辑 ]
1