我无法解决为什么在打印变量地址
之间的区别时发现差异以下是代码:
int main()
{
int *a,b = 5,e = 0;
int *c,d = 10,f = 0;
long t1,t2;
a = &b;
c = &d;
e = &b;
f = &d;
t1 = e - f;
t2 = a - c;
printf("\n Address of b using a: %x \t %d using e : %x \t %d value of b : %d",a,a,e,e,b);
printf("\n Address of d using c: %x \t %d using f : %x \t %d value of d : %d",c,c,f,f,d);
printf("\n Value of t1 : %d",t1);
printf("\n Value of t2 : %d \n",t2);
}
这是输出:
Address of b using a: bf9e9384 -1080126588 using e : bf9e9384 -1080126588 value of b: 5
Address of d using c: bf9e9380 -1080126592 using f : bf9e9380 -1080126592 value of d: 10
**Value of t1 : 4
Value of t2 : 1**
为什么将t1和t2分配给相似的差异
时,它们之间存在差异请告诉我。
答案 0 :(得分:8)
a
和c
是指针,因此获取指针的不同会返回它们之间的元素数量。 e
和f
是整数(其值只是b
和d
的地址);取整数差异实际上只是一个减法,所以它返回字节数。
注意(1):由于两个指针的差异不是指向同一个数组的元素而产生的行为是 undefined 。
注意(2):为int
分配地址所产生的行为是实现定义的。
注意(3):两个指针的区别在于ptrdiff_t
类型,其大小为实现定义。因此,将此分配给long
也是实现定义的。
注意(4):在同一行(例如int *a,b = 5,e = 0;
)混合指针和非指针的声明被认为是非常糟糕的做法,因为它令人难以置信的混乱!
答案 1 :(得分:0)
您看到不同值的原因是e-f
是int
算术,而a-c
是int*
算术。在int*
算术中,差异是可以放在两个指针之间的ints
的数量,因此4字节整数的结果是4倍。
这就是说,减去两个不指向同一个数组的指针称为“未定义行为”,理论上任何事情都可能发生。