2013-09-22 93 views
1
int value = 5; 
int a[ ] = {2,4,6,9,3,5,7}; 
int *q1 = &value; 
int *q2 = a; 
int *q3 = &a[2]; 
int *p[ ] = { q1, q2, q3 }; 

cout<<p[0][0]<<" " <<p[1][1] <<" " <<p[2][3]; 

answer is 5 4 5. 

我知道我怎樣才能得到答案?我很困惑,感謝導遊!C++指針表達和陣列

+1

我也很困惑。你期望得到的答案是什麼,它與你所得到的有什麼不同? – jrok

+0

不,我不明白我怎麼能得到的值,如圖... – user2611244

+0

'動態數組allocation'在你的代碼不使用,所以我糾正了冠軍。 –

回答

4

你需要知道:

  1. 表達a[i]相當於*(a + i),所以表達a[i][j]相當於*(a[i] + j)這也相當於*(*(a + i) + j)

  2. 當分配陣列名稱給它衰變爲例如第一元件地址的地址的指針:

    int a[ ] = {2, 4, 6, 9, 3, 5, 7}; 
    int *q2 = a; 
    

    現在q2指向是a[0]第一元件。

    閱讀也有一些exceptions where array name not decaying into a pointer to first element?巧妙地@H2CO3回答。

  3. 當您將i添加到指針p時,它會從p地址開始指向ith元素位置。因此,假設id p指向數組p + 3中的第二個元素指向數組中的第五個元素(類似地,減法在相反的方向上工作)。閱讀10.2 Pointers and Arrays; Pointer ArithmeticPointer Arithmetic

要回答你的問題:在代碼:

int value = 5; 
//   0 1 2 3 4 5 6 
int a[ ] = {2, 4, 6, 9, 3, 5, 7}; 
int *q1 = &value; 
int *q2 = a; // address of array a decays into address of first element 
int *q3 = &a[2]; 
int *p[ ] = { q1, q2, q3 }; // can be written as below 

最後一行相當於:

int *p [] = { &value, a, &a[2]}; 

指針Ppointer to int陣列,使得p[i]意味着地址,p[i][j]爲int值:

p[0][0] == *(p[0] + 0) == *(&value + 0) == *&value == value == 5 
p[1][1] == *(p[1] + 0) == *(a + 1) == a[1] == 4 
p[2][3] == *(p[2] + 3) == *(&a[2] + 3) 
      //   0 1 2 3 4 5 6 
      //int a[ ] = {2, 4, 6, 9, 3, 5, 7}; 
      //     +1 +1 +1 
         == that is value at 3rd location from index 2 
         == a[5] == 5 
// When you add 1 to an address pointer start pointing to next location 

@From Dyp:你能理解最後一個表達式爲:
表達*(&a[2] + 3)被定義爲*(&*(a+2) + 3),這等於*(a+5)和同爲a[5]

p[2][3] == *(p[2] + 3) == *(&a[2] + 3) == *(&*(a+2) + 3) 
             == *((a+2) + 3) 
             == *(a + 2 + 3) 
             == *(a + 5) == a[5] == 5 

希望這有助於。

+0

'*(&一個[2] + 3)'被定義爲'*(&*(A + 2)+ 3)',其等於'*(A + 5)'和相同'一個[5 ]'。 – dyp

+0

@DyP尼斯損失我想補充我的答案。 –

+0

感謝您的解釋! =) – user2611244