2014-10-02 63 views
2

在下面的程序中,這裏ptr已被聲明爲指向整型指針的指針,並且指定了數組p[]的基址,該數組已被聲明爲整型指針數組。假設ptr包含地址9016(假設p的起始地址是9016),在ptr遞增之前和ptr++之後,它將包含值9020(假設int需要4個字節)。指針算術錯誤輸出

所以ptr-p應該給出輸出爲4即(9020-9016 = 4)。但它將輸出結果設爲1。爲什麼?

#include<stdio.h> 
int main() 
{ 
    static int a[]={0,1,2,3,4}; 
    static int *p[]={a,a+1,a+2,a+3,a+4}; 
    int **ptr=p; 
    ptr++; 
    printf("%d",ptr-p); 
    return 0; 
} 
+0

單獨將指針轉換爲整數類型,然後才減去。 – 2014-10-02 09:40:58

回答

8

一個指針的結果減去另一個指針是元件它們之間,而不是字節數的數量。

int **ptr=p; 
ptr++; 

ptr向前移動一個元件,所以ptr - p具有1的值。

順便說一句,這種行爲是ptr++(這意味着在您的示例ptr = p + 1;一致。

+0

謝謝@yu Hao thanki – Walter 2014-10-10 12:25:35

2

從相同的基本類型的另一個指針的指針中減去返回一個整數,其表示的該元素的數量在兩者之間指針。

如果我們有2指針2個int指針p1p2,包含地址1000和1016分別接p2-p1會給4(因爲int 4大小)。

1

當您找到兩個指針之間的差異時,您將獲得它們之間的對象數量。 在這種情況下,對象是整​​型的,你得到了正確的價值1

如果你想知道以字節爲單位的值,那麼你應該做的:

printf("%d",(char *)ptr-(char *)p); 

這將打印4。