2014-02-06 62 views
-12

首先:我還沒有搜索論壇回答我的 問題;因爲我跑出來time.This的是我最後的 分鐘疑問指針在C中的算術和數組大小

如何printf("%d\n", q -p);打印1和printf("%d\n", (int)q -(int)p);打印8下面的例子中:

#include <stdio.h> 
int main(void) 
{ 

    double a[2], *p ,*q; 
    p = a; 
    q = p + 1; /* isn't q holding value of address next to that of p?*/ 
    printf("%d\n", q -p); /* 1 is printed */ 
    printf("%d\n", (int)q -(int)p); /*8 is printed*/ 

    return 0; 
} 

感謝您的諒解

+0

你甚至在問題的標題mentinoned,這就是所謂的指針算術。如果你想了解它,只是閱讀它(谷歌,維基等...) –

+2

因爲'q - p == p + 1 - p == 1' –

+0

_「我還沒有搜索論壇的答案我的下面的問題;因爲我沒有時間了。「_你爲什麼耗盡時間,爲什麼? –

回答

6

好吧,讓我們替代。我們知道:

q = p + 1; 

則有:

printf("%d\n", q - p); 

必須是:

printf("%d\n", p + 1 - p); 

這樣的:

printf("%d\n", 1); 

所以,這就是你得到了什麼。有指針算術發生,但如果沒有發生,那會不會更奇怪?

基本上這:

q = p + 1; 

指 「讓q點在下一double,跳過在p一個」。由於qp的類型爲double *,因此在double中完成。在你的系統上,這似乎跳過了8 char s。

+0

這不是下一個double [2]大小的地址,而是指針大小的地址,不是嗎? 'q'和'p'都是指針。 – DarkDust

+0

@DarkDust Gah,不,這是一個單一的'double',算術是以指向的類型爲單位的,並且'p'和'q'都是'double *'。我犯了一個錯誤,涉及'a'。 – unwind

+0

D'呃......需要更多的咖啡,看起來:-P – DarkDust