多维数组和指针寻址

时间:2015-10-20 05:24:37

标签: c

#include <stdio.h>
int main(void)
{
  int x[2][3] =
  {
    {4, 5, 2},
    {7, 6, 9}
  };
  int (*p)[3] = &x[1];
  int (*q)[3] = x;
  printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]);  //7, 6, 9
  printf("%d %d\n", *q[0], *q[1]);  // 4, 7
  return 0;
}

x [0] ----&gt; [4,5,2]。

x [1] ----&gt; [7,6,9]

所以如果p=X[1]p[0]=7p[1]=6p[2]=9,那么第一个printf是可以理解的。

对于第二个printf,x将等于数组的地址第一个元素。如果* q [0]为4,为什么* q [1] 7,不应该是5?它跳了一排。

链接的实际输出:

7 6 9
4 7

4 个答案:

答案 0 :(得分:1)

比较这两行:

printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]);  //7, 6, 9
printf("%d %d\n", *q[0], *q[1]);  // 4, 7

在第一行中,您首先取消引用指针,然后访问索引 - 在第二行中,您错过了括号。将其更改为:

  printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]);  // 7, 6, 9
  printf("%d %d %d\n", (*q)[0], (*q)[1]);  // 4, 5

将按预期输出值。

答案 1 :(得分:0)

它指向x中的第二个数组。

如果你想获得第一行的所有元素,你可以使用这样的东西。

#include <stdio.h>
int main(void)
{
int x[2][3] =
{
{4, 5, 2},
{7, 6, 9}
};
int (*p)[3] = &x[1];
int (*q)[3] = x;
printf("%d %d %d\n", (*p)[0], (*p)[1], (*p)[2]);  //4, 5, 2
printf("%d %d %d\n", *q[0], q[0][1],q[0][2]);  // 4, 5,2
return 0;
}

答案 2 :(得分:0)

你得到的输出是有效的。

*q[1]相当于q[1][0]。因此,该指数的值为7,您将其作为输出。

要获得5,您可以像q[0][1]或其他方式来代表(*q)[1]

答案 3 :(得分:0)

这是运营商优先问题。 []的优先级高于一元*。如果将[]应用于数组指针,它将按照与常规指针相同的规则执行指针运算。

对于任何指针类型,ptr[i]等于*(ptr + i)ptr+i表示“给我ptri*sizeof(*ptr)字节的地址。

因此,在您的情况下q[1]表示“给我q + 1*sizeof(*q)的地址,其中q的内容是3个整数的数组。所以你结束了指向第二个数组的开头。