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)that 也等价于*(*(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指向数组中的第二个元素,指向数组中的第五个元素(类似地,减法在相反的方向上起作用)。阅读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]};

Pointer是一个so表示地址P的数组,并且是 int 值:pointer to intp[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 回答