2014-02-21 53 views
2
int a[3]; 
int *j; 
a[0]=90; 
a[1]=91; 
a[2]=92; 
j=a; 
printf("%d",*j); 
printf("%d",&a[0]) 
printf("%d",&a[1]); 
printf("%d",*(j+2)); 

這裏指針變量j指向a[0],這是90操作;和a[0]地址是-20是我的機器上。所以j是-20。 而a[1]的地址是-18。所以要獲得下一個變量,我應該使用*(j+2)。因爲j+2將導致-18。但這實際上正在進行。要訪問a[1]。我必須使用*(j+1)。但j+1=-19。爲什麼j+1導致-18?添加上指針

+3

'和[0]的地址是-20 ...' - 地址不會是負數...地址是無符號的。 –

+0

你給整數指針賦值了整數數組地址a的值,它是一個常量整數指針。一個[0]相當於*(a + 0),這顯然是一個整數,而不是一個整數指針。 – ChuckCottrill

+0

'*(x + y)'完全等價於'x [y]'(或'y [x]')。所以要打印'a [1]',你需要'*(j + 1)'(或者只是'j [1]')。 –

回答

3

地址是無符號的。你打印它們就好像它們是int,但它們不是int。使用"%p"作爲格式說明符。這就是你如何打印指針的地址。

此外,指針算術與您習慣的算法不同。在內部,將一個加到指針p上的地址增加了sizeof *p字節,即它增加到下一個對象。

這是方便,因爲它有一個指針執行運算時,總是使用sizeof節省了程序員(很少這樣做你真正想要的不是sizeof *p以外的東西遞增。當你這樣做,你投先一char*)。

0

指針加法與簡單加法不一樣。

它取決於指針指向哪種類型的變量。

在你的情況下它是一個int大小是機器相關的(你可以檢查做sizeof(int))。

所以加入多種的指針等(j+i)當它在內部轉換爲(j+i*sizeof(datatype))所以當鍵入(j+2)的地址被增加了4倍(假定INT爲2個字節),這是不期望的結果。

(j+1)會給你正確的結果(這好像是說點數據的整型的下一個元素)

0

其實指針邏輯的作品,因爲整數指針類型的大小移動指針類型的基礎上,整數在你的機器上,它移動你的機器上的2個字節,所以p + 1 = p +(sizeof(指針類型))

0

*(x+y)總是完全等於x[y](或y[x])。因此要打印a[1],您需要*(j + 1)(或者只是j[1])。請注意,在a[1],a被轉換爲一個指針......處理a的方式與在此處理j的方式之間沒有區別。