题目:
int main()
{
int a[5] = { 1,2,3,4,5};
int * ptr = (int * )(&a + 1);printf("%d,%d",*(a + 1),*(ptr - 1));
return 0;}
思路分析:
int * ptr = (int * )(&a + 1);
- &a ——表示的是整个数组的地址,而在内存存储中,整个数组的地址其实是在首元素地址的前一个空间位置,所以&a所展示的位置如上图所示。
- &a+1——在很多的数据类型中,+1表示的是加多少字节,字节数取决于类型数,而&a+1中的&a表示的是数组的地址,那么这就表示了加一个&a一样大小的字节数,然后抵达的地址。
- 而这个地址也如图整个数组地址一样,处在下一个数组之前的空间位置,或者处在这个数组空间之后的一个空间位置。
- (int*)——&a+1表示的是数组的地址,而(int*)是进行强制类型转化,转化为int类型的指针地址
*(ptr - 1)
- 如图,结合上一步的分析, &a+1被强制类型转化为了int*类型的并赋予了同样类型的ptr
- ptr的内部存放的是&a+1的地址,但是整个地址被转化为了int*类型
- 进行ptr-1后,这个-1的操作从数组数据类型变为了int类型的,因此-1减去的是四个字节,在int类型的数组中,四个字节表示一个元素,因此ptr-1便是如图中所示,移动到了数组的最后一个元素。
- 所以*(ptr-1)得到的结果是数组的最后一个元素 5
*(a + 1)
- a——数组名,因为并不是在sizeof中,所以该处的a表示的是首元素的地址
- a+1——在很多的数据类型中,+1表示的是加字节数,而加上的字节数取决于数据的类型,眼下的a表示的是首元素的地址,而首元素表示的是int类型,也因此+1表示的是加四个字节,也就从首元素地址变成了第二个元素的地址
- *(a+1)——表示的就是第二个元素地址指向的元素,也就是第二个元素 2
结论:
- &a+1 —— &a 表示的是数组的地址,+1加的是这个数组的总字节数大小后,抵达的位置。
- a+1 ——a表示的是首元素的地址,+1加的是同这个元素一样的字节数大小后,抵达的位置。
- 加上的字节大小,看数组的数据类型或者元素的数据类型。