#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]=7
,p[1]=6
和p[2]=9
,那么第一个printf是可以理解的。
对于第二个printf,x
将等于数组的地址第一个元素。如果* q [0]为4,为什么* q [1] 7,不应该是5?它跳了一排。
链接的实际输出:
7 6 9 4 7
答案 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
表示“给我ptr
加i*sizeof(*ptr)
字节的地址。
因此,在您的情况下q[1]
表示“给我q
+ 1*sizeof(*q)
的地址,其中q
的内容是3个整数的数组。所以你结束了指向第二个数组的开头。