2015-10-17 112 views
1
#include <stdio.h> 
int main() 
{ 
    int a[][3] = {1, 2, 3, 4, 5, 6}; 
    int (*ptr)[3] = a; 
    printf("%d %d \n ", (*ptr)[1], (*ptr)[2]); 
    ++ptr; 
    printf("%d %d\n", (*ptr)[1], (*ptr)[2]); 
    ptr++; 
    printf("%d %d\n", (*ptr)[1], (*ptr)[2]); 
    return 0; 
} 

誰能爲什麼在第一個printf解釋,(* PTR)[1],(* PTR)[2]是給2,3作爲輸出?指針陣列順從

不是(*ptr)[1]輸出應爲4和(*ptr)[2]輸出應該0?

是它意味着(*ptr)[1]等於ptr[0][1](*ptr)[2]裝置ptr[0][2]

回答

1
int (*ptr)[3]

限定一個指向3個元素的數組。

因此訪問(*ptr)[1]指的是現在ptr指向的數組的第二個元素(例如它指向的是包含2的位置)。把它想象成一個矩陣。 Ptr指向該行(例如,它將指向包含4的位置)。

現在關於ptr++。編譯器知道ptr指向一個由3個int元素組成的數組。所以步驟ptr++將指針遞增3 * sizeof(int)。在我們的矩陣類比中,ptr現在指向下一行。 (* ptr)[1]等於ptr [0] [1]和(* ptr)[2]意味着ptr [0] [2]?「是正確的

0

首先,你需要記住,

int a[][3] = {1, 2, 3, 4, 5, 6}; 

相同

int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; 

int (*ptr)[3] = a; 

相同

int (*ptr)[3] = &a[0]; 

現在,(*ptr)[1]第一指針引用ptr導致第一子陣列。然後,[1]獲取從第一子陣列,其是2。類似地,第一(*ptr)[2]解引用ptr通向第一子陣列的第二元件。然後,[2]得到第三元件從所述第一子陣列,其是3

接着,

++ptr; 

增量ptr這意味着,現在,它指向所述第二子陣列的地址。所以現在,(*ptr)[1]首先解引導ptr導致第二個子數組。然後,[1]獲取從第二子陣列,其是4同樣,(*ptr)[2]第一解引用ptr通向第二子陣列的第二元件。然後,[2]獲取從第二子陣列,其是5

現在所述第三元件,

ptr++; 

進一步增量ptr這意味着它現在指向存儲器addess 過去第二子陣列或二維陣列。在此之後,如(*ptr)[1](*ptr)[2]中所示,清除指針時將調用未定義的行爲,因爲您正在讀取陣列之後的無效內存地址。

最後,

是不是就意味着(*ptr)[1]等於ptr[0][1](*ptr)[2]意味着ptr[0][2]

是。正確。

+0

感謝您的酷解釋:) –

+0

不客氣!如果答案回答你的問題,鼓勵[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 –