双指针地址添加问题

时间:2016-06-20 14:44:20

标签: c pointers double-pointer

我在指针端的开源代码中遇到了一个问题,我试图在下面的小片段中复制。

int main()
{
int **a=0x0;
printf ("a = %d Add = %d\n", a, a+75);
return 1;
}

期望是获得75 / 0x4B但是这个代码在32位中提供300,在64位机器中提供600。

输出:

a = 0 Add = 600

但是获取增加位置背后的意识形态,即哈希表中的第75位。

所以它应该是

printf ("a = %d Add = %d\n", a, sizeof (a)+75);

但我无法猜出为什么这300或600输出。有人可以指出吗?

我直到内心发生了一些左移:

75 - 1001011
600 - 1001011000.

非常感谢解决方案。提前谢谢。

3 个答案:

答案 0 :(得分:2)

指针算术总是使用指向的大小来完成。在您的情况下,a是指向指向int 的指针,因此单位大小为sizeof(int*),在您的情况下似乎为4(32位)。 4 * 75 = 300。

更确切地说,a + 75将字节偏移sizeof(*a) * 75(注意a的解除引用)添加到指针。发生的事情是你实际上在做&a[75],即你得到一个指向第75个元素的指针。

在一个稍微相关的说明中,当您使用printf打印指针时,您应使用格式"%p",并将指针转换为void *。参见例如this printf (and family) reference

至于32位和64位系统的不同大小,这是可以预期的。 32位系统上的指针通常为32位,而在64位系统上则为64位。

答案 1 :(得分:1)

程序行为未定义:

  1. 格式说明符%d对指针类型无效:请改用%p。

  2. 指针算法仅在数组的最后一个元素内有效,或者在数组的最后一个元素之后有效,或者超过标量的标量地址。你不能阅读+ 75。

答案 2 :(得分:0)

首先,使用%p打印指针,使用%zu打造sizeof结果。

也就是说,检查a的类型,它是int **,这是指针的大小。而且,它取决于平台/编译器。

指针算法遵循数据类型,因此初始指针总是根据LHS数据类型递增。

相关问题