2014-10-02 28 views
-2
#include <stdio.h> 
    #include <stdlib.h> 

    int main() 
    { 
     int arr[]={10,20,30,40,50,60,70};  
     int *i,*j,*k;  
     k=2686703;  
     i=&arr[1];  
     j=&arr[5];   
     printf("%d\n%d\n",i,j) ;   
     printf("%d\n",j-i);   
     printf("%d",*(k)); 
     return 0; 
    } 

輸出:c中數組中指針變量的減法?

2686700 
2686716 
garbage value 

爲什麼是j和i = 4,而不是16之間的差異?如果爲數組中的每個整數保留4個字節,爲什麼它們的垃圾值會對這個中間地址產生影響?

+1

請澄清你的問題和你的樣品。例如,printf(「%d \ n%d \ n」,j-i)是錯誤的,因爲您只能顯示一個變量。我知道你正在試圖理解數組的指針是如何工作的,但問題和示例不清楚(並且示例包含「絕對」值k = 2686703,不能用於別處 – tomsoft 2014-10-02 17:32:04

+0

如何分配'k = 2686703 ;'?這裏k是指針 – Rustam 2014-10-02 17:33:25

+1

格式字符串中的整數類型也是錯誤的,指針減法結果爲ptrdiff_t值,可以打印爲%td(假設C99/C11,C89需要強制轉換) – doynax 2014-10-02 17:38:29

回答

2

爲什麼是j和之間的差i = 4的,而不是16,並且如果4個字節在一個陣列

保留用於每個整數因爲這是指針運算如何工作的:它劃分sizeof(element)出來的區別。這很容易用指針來編程,因爲程序員更容易考慮數組元素而不是原始字節的偏移量。

爲什麼是垃圾值corrosponding這個中間地址

取消引用指針k,被分配不與任何整數對齊的值。一般來說,這是未定義的行爲。然而,就你而言,你選擇了一個恰好指向數組中間的值。根據系統的不同,結果可能是任何事情 - 由於未對齊的讀取導致崩潰,從而將有效字節重新解釋爲不同的整數。