C 多维数组和指针寻址

C 多维数组和指针寻址,c,C,它指向x中的第二个数组 如果您想获得第一行的所有元素,可以使用类似这样的方法 7 6 9 4 7 #包括 内部主(空) { 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 返回0; } 比较这两行: #incl

它指向x中的第二个数组

如果您想获得第一行的所有元素,可以使用类似这样的方法

7 6 9 4 7
#包括
内部主(空)
{
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
返回0;
}

比较这两行:

#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;
}
在第一行中,您首先取消了对指针的引用,然后访问了索引-在第二行中,您缺少了括号。将其更改为:

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

将按预期输出值。

您得到的输出有效

*q[1]
相当于
q[1][0]
。因此,该索引处的值为
7
,作为输出


要获得
5
,您可以这样编写
q[0][1]
,或者以其他方式表示
(*q)[1]

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

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


所以在你的例子中,
q[1]
的意思是“给我
q
+
1*sizeof(*q)
,其中
q
的内容是一个3个整数的数组。因此,您最终指向第二个数组的开头。

p
的输出不应该是7、6和9,因为
p
指向
x
中的第二个数组吗?请编辑问题,以包含问题中显示的实际程序的实际输出(复制和粘贴)。@JoachimPileborg我也得到了:你是正确的,抱歉,修正了。键入了错误的行,但问题仍然存在。这是一个关于数组索引运算符
[]
比解引用运算符
*
具有更高的优先级的问题。您应该真正了解该语言的基础知识。使用运算符优先级表可以很容易地回答这个问题…
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