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.

どうすれば答えを得ることができるか知っていますか?私は混乱しています、ガイドに感謝します!

4

1 に答える 1

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]

    配列名が最初の要素へのポインターに減衰しないいくつかの例外もお読みください。@H 2 CO 3でうまく答えられます。   

  3. iポインターに追加すると、アドレスから要素の場所をp指し始めます。したがって、idが配列の 2 番目の要素を指し、配列の 5 番目の要素を指すとします (同様に、減算は反対方向に機能します)。10.2 ポインタと配列を読んでください。ポインター演算ポインター演算ithppp + 3

あなたの質問に答えるには: コードで:

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]};

ポインタはアドレスPの配列であり、pointer to intint値です。p[i]p[i][j]

 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

この助けを願っています。

于 2013-09-22T09:29:48.693 に答える