2011-03-29 53 views
-1

考慮以下PROGRAMM,關於在C指針

#include<stdio.h> 
int main() 
{ 
    int marks[]={20,65,45,68,89}; 
    int *x,*y; 
    x=&marks[2]; 
    y=&marks[4]; 
    printf("%p\n%p\n"x,y); 
    printf("%p\n%p\n",y-x,*y-*x); 
    return 0; 
} 

當我想打印出來的y-x值,控制檯應該給我等於相應指針的地址之間的差值輸出。畢竟,我們知道xy具有地址('某個整數值')。但事實並非如此。爲什麼?

+0

你得到的輸出是什麼? – 2011-03-29 11:46:41

+1

你能改述並刪除blockquote嗎?你爲什麼要調用stackoverflow先生? – 2011-03-29 11:46:46

回答

0

的距離控制檯必須給我等於相應的指針

的地址之間的差值輸出...和它。對我來說,它輸出2。如果您比較地址,則會看到它們被8個字節分隔,即2 int s,這是您尋求的答案。

2

如果您使用%p打印差異,您可能會遇到難以閱讀的內容。

正確的方法可能是使用%lu個,並投:

printf("%lu\n", (unsigned long) (y - x)); 

打印整型量*y - *x爲%P似乎完全糊塗了。

+0

只是爲了澄清(對於OP):按定義減去指向同一對象的兩個指針將產生一個intptr_t類型的R值。因此,這種類型轉換不需要將指針轉換爲整型,但要確保指針算術產生的整數正確地傳遞給由printf解釋的任何類型。 – datenwolf 2011-03-29 12:24:33

3

指針減法不是簡單地減去地址,而是返回兩個數組元素之間的距離(按照元素)。

所以y - x不是指針,但價值2的整數 - 和給printf,你shold使用%d格式,現在%p

+0

從技術上講,我們不知道格式是否也是%d,這取決於ptrdiff_t有多大。 – 2011-03-29 12:26:48

1

在同一個數組中減去2個指針的結果是數組中指針之間的距離,所以y-x在你的例子中應該等於2。

爲了讓他們投給某個整數地址間的差從其減去前:

printf("%d",(size_t)y-(size_t)x); 
1

y-x將評估爲2 - 因爲它們之間是2個整數的距離。

如果您打印例如(char *) y - (char *) x你會得到字符