2014-04-07 80 views
-1

下面的C程序C和指針操作問題


#include <stdio.h> 
#include <stddef.h> 

#define A 1 
#define B 1 

int main(){ 
    int a[A], b[B]; 
    ptrdiff_t delta; 


    printf("%p %p",&a+A,&b); 
    delta=&a+A-&b; 
    printf("\n* %td *\n",delta); 

    if ((&a+A)==&b) printf("\n==1.1"); 
    if ((&a+A)-&b==0) printf("\n==1.2"); 
    if (&a==&a) printf("\n==2"); 

    return 0; 
} 

會產生這樣的結果:

0x7fff107d5454 0x7fff107d5440 
* 5 * 

==2 

你能EHY 0x7fff107d5454-0x7fff107d5440=5解釋我?

+1

'&a'是一個'int(*)[A]',即一個指向大小爲「A」的數組的指針,而不是指向int的指針。數組衰減爲指向其第一個元素的指針,所以'a + A'或'&a [0] + A'是等價的,並且會以'A * sizeof(int)'增量。 –

+0

[Pointer subtraction confusion]的可能重複(http://stackoverflow.com/questions/3238482/pointer-subtraction- confusion) –

回答

2

這是指針算術。嚴格來說,0x7fff107d5454 - 0x7fff107d5440是0x14,即十進制20。在指針算術中,實際差異除以基本指針類型的大小,在這種情況下,整數(在您的系統上)爲4。所以你得到5.