2017-07-31 54 views
-1

我瞭解*(p + i)的工作原理,但是,當通過printf()函數檢索包含*(pi)或p [-i]的值時,內存級別實際發生了什麼? ?使用指針以相反順序檢索值

#include <stdio.h> 

int main() {  
    int i, arr[5] = {1, 2, 3, 4, 5}, *p; 
    p = &arr[4];  
    for (i = 0; i < 5; i++)   
     printf("%d\t%d\t", *(p - i), p[-i]);  
    // why does this prints in reverse order? 
    return 0; 
} 

回答

1

很簡單,*(p - i)p[-i]是完全不同的語法相同。有意思的是,您也可以編寫-i[p],其含義與*(p - i)完全相同。

它輸出以相反的順序,因爲在開始在arr[4],然後通過一個減去i從指針,它減去012一個,直到它到達4,所以它打印p[4]p[3]p[2]p[1]p[0]這是從最後一個元素到第一個元素的數組arr

+0

感謝Iharob打印,我明白了。但是,在內存級別或字節方面實際發生了什麼。 – ninja

+2

你是什麼意思?你不明白指針算術? –

+0

哦! thnks明白了:p – ninja

0

你在指針分配的最後一個元素的地址,並通過一個地址減去一個,因此它以相反的順序

+0

假設您的整數每個需要4個字節,並且讓1000爲arr [0]的內存位置,則下面是內存分配 1000 => arr [0] 1004 => arr [1] 1008 => arr [2] 1012 => arr [3] 1016 => arr [4] 現在當您分配指向arr [4]的指針時,它指向位置1016 ...現在您逐一減少它,這意味着減少4字節在一個時間 –

+0

得到它的人! thnx – ninja

+0

嗨@ninja,請將此答案標記爲有用的投票向上箭頭如果它是:-) –