2012-09-27 227 views
0

我所遇到出外代码:指针运算和地址

#include <stdio.h> 

int main(void) 
{ 
int a[5] = { 1, 2, 3, 4, 5}; 
int *ptr = (int*)(&a + 1); 
int *ptr2 = (int*) &a; 
ptr2 +=1 ; 
printf("%d %d %d \n", *(a + 1),*(ptr - 1) ,*ptr2); 
return 0; 
} 

指针算法确实对我来说,除了这行:

int *ptr = (int*)(&a + 1); 

它是不确定的行为? 为什么我们得到5取消引用*(ptr - 1)

+2

'int a [5] = {1,2,3,4,5,6};'是一件很糟糕的事! – jn1kk

+0

@jsn我的坏!这只是问题中的5个元素,我在复制代码之前做了一些奇怪的测试,我会改变它:)但问题依然存在。 – user1471

回答

2

试一试吧!

int a[5] = {1, 2, 3, 4, 5}; 
printf("%#x, %#x, %#x, %#x\n", a, &a, a+1, &a+1); 

0xbfa4038c, 0xbfa4038c, 0xbfa40390, 0xbfa403a0 

那么,这告诉我们什么?

0xbfa4038c == 0xbfa4038c这意味着a == &a。这是数组中第一个元素的地址或a[0]

我们知道,int的大小是4,并且知道*(a+1) == a[1](所述阵列中的第二个元素),并且这是通过证明:

0xbfa4038c + 0x4 = 0xbfa40390这意味着a + one int = address of the next element

因此如果我们看到&a+1 == 0xbfa403a0,这意味着我们将((0xa0-0x8c)/4) = 5个元素放入数组中。你知道a[5]是无效的,所以这意味着我们通过了数组的末尾。

所以如果你拿:

int *ptr = (int*)(&a + 1); //one passed last element in the array 
printf("%d",*(ptr - 1));//back up one, or last element in the array and deference 

这就是为什么你5

+0

+1 Got it!我仍然困惑了一下!a和&a给出地址,但给两者加1会给我们不同的结果。 &a + 1增加了5个整数,因为(a)的大小是5 * sizeof(int),但为什么不是+ 1? – user1471

+1

+1正在根据TYPE添加一个地址。尝试[此链接](http://stackoverflow.com/questions/2989370/why-do-a1-and-a1-give-different-results-when-a-is-an-int-array)作为答案你的问题(不是选定的答案,更多的选票更清晰) – Mike

3

a的大小是“5 int s”。所以&a + 1指的是第一个存储单元过去的全都是a,因为指针算术是以大小为a为单位完成的。

+1

int * ptr =(int *)(&a [0] + 1); //数组的第二个元素a –

+0

@RichardChambers是?不知道这是否意味着作为一个反对论点......这是因为'+ 1'适用于'&a [0]'的结果,并且其类型是普通的'int'。 – unwind

+0

@unwind我认为他发布这个作为OP的修复。 – jn1kk

0

T类型的n个元素的数组,然后第一个元素的地址的类型是“指向T”; the address of the whole array具有类型'指向T类型的n个元素的数组的指针';

int *ptr = (int*)(&a + 1); //&a-> address whole array, size=20 bytes, 
     //ptr=&a+1: next element =adress of a +20 bytes. 
     //ptr - 1 = address of a +16 = address of last a's element = address of 5