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