与指针数组中的引用项混淆

时间:2018-10-29 00:27:46

标签: c arrays pointers

我在理解这段代码如何输出10时有些麻烦。我知道p是指针数组中第一个元素的地址,这意味着p + 1是列表中第二个元素的地址。含义*(p + 1)是数组n的第一个元素的地址。因此,*(*(p + 1)+1)求值为数组n的第二个元素。但是,我对下面的代码如何输出值10(即数组r的第一个元素)感到困惑。非常感谢您的帮助。

int m[4]={-2,3,6,8,9}, n[4]={7,6,4,3}, r[4]={10,-3,5};
int *p[3]={m,n,r};
printf("%d", *((p+1)[1]));

2 个答案:

答案 0 :(得分:1)

p开始:

  • p{m, n, r}
  • p+1{n, r}
  • (p+1){n, r}
  • (p+1)[1]r
  • ((p+1)[1])r
  • ((p+1)[1]){10, -3, 5}
  • *((p+1)[1])10

请注意,(p+1)[1]的意思是*((p+1)+1),而不是(*(p+1))+1

答案 1 :(得分:1)

您有一个指针数组,因此 p 是指向-2( m 数组的开头)和 p + 1 的指针是指向7( n 数组的开头)的指针。

所以 p 是指向包含3个指针的数组开头的指针,而 p + 1 是指向包含2个指针的数组开头的指针,并且当您编写(p + 1)[1] 时,您得到的结果与 p [2] 相同。

*p[2] == *(p+1)[1] == *(p+2)