2

I found this program in a contest question paper:

#include <iostream>
void main() 
{    
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int*)(&a + 1);
    printf("%d %d ",*(a + 1), *(ptr - 1));
}

The output is 2 5

now when I change the 5th line to int *ptr=(int*)(&a); and printf("%d %d ",*(a + 1), *(ptr));

The output becomes 2 1

In the first case the ptr got the last address of the array+1 and in the second case the ptr got the same address of the array(address of a).

My doubt is why does this assignment show different kind of behavior when the a is incremented and assigned to ptr and when a is assigned to ptr without incrementing?

4

3 回答 3

5

当您获取数组的地址时,您会得到一个指向 5 个整数(即int(*)[5])的数组的指针。当您增加该指针时,它会移动 5 个整数数组的大小。所以它指向数组序列中的下一个数组(如果你实际上有一个数组序列)。然后,当您将该指针转换为 时int*,它会成为指向int第二个(不存在的)数组的第一个的指针,该数组是第一个数组的最后一个元素之后的一个元素。这就是您的第一个示例所发生的情况。

在您的第二个示例中,您不会增加指向数组的指针,因此当您将其转换为 时int*,它会成为指向int数组中第一个的指针。

于 2014-12-14T06:12:36.717 回答
3

&a是指向大小为 5 的整数数组的指针,ptrint*. 因此,&a + 1以 an 的大小递增int[5],而对 an 的指针算术int*将指针的值更改为 的倍数sizeof(int)。因此,&a + 1是指向5*sizeof(int)来自 的地址的地址a。将其转换为 anint* ptr并做为ptr-1您提供a[4].

于 2014-12-14T06:14:33.177 回答
2
&a + 1;

这里,simplea是指数组的基地址,即第一个元素的地址。当你说a+1编译器会看到+1应用于pointer to an int. 因此,它将增加偏移量,这将使其跳转到下一个整数。

但是,当您说 时&a,它表示该数组元素的地址(类型为int [5])。因此,向其添加一个意味着下一个偏移量将指向该类型的下一个数组,即间接指向数组的过去一端。在不取消引用之前,获取过去数组元素的地址是没有问题的

于 2014-12-14T06:18:23.643 回答