`int`数组中的输出无效

Sur*_*raj 24 c pointers

我正在努力学习指针,我刚遇到一个我不明白的情况.

int main()
{
  int num[3][2]={3,6,9,12,15,18};
  printf("%d %d",*(num+1)[1],**(num+2));
}
Run Code Online (Sandbox Code Playgroud)

据我所知,输出应该是:

12 15
Run Code Online (Sandbox Code Playgroud)

但实际上它是:

15 15
Run Code Online (Sandbox Code Playgroud)

为什么?请澄清在这里如何计算事物,我认为首先*(num+1)计算并指向第一个{9,12},然后[1]应该取消引用第一个元素即12.

我正在使用GCC编译器.

Dr.*_*ana 24

在您的数据中,

int num[3][2]={3,6,9,12,15,18};
Run Code Online (Sandbox Code Playgroud)

相当于:

int num[3][2]={{3,6},{9,12},{15,18}};
Run Code Online (Sandbox Code Playgroud)

num[0][0] = 3
num[0][1] = 6
num[1][0] = 9
num[1][1] = 12
num[2][0] = 15
num[2][1] = 18
Run Code Online (Sandbox Code Playgroud)

从而,

*(num+1)[1]
= *(*(num+1+1))
= num[2][0] 
=15
Run Code Online (Sandbox Code Playgroud)

和,

**(num+2))
= num[2][0]
=15
Run Code Online (Sandbox Code Playgroud)


250*_*501 20

数组下标[]运算符的优先级高于解除引用运算符*.

这意味着表达式*(num+1)[1]相当于*((num+1)[1])

如果我们把它分开

*(*((num+1)+1))

*(*(num+2))

*(num[2])

num[2][0]
Run Code Online (Sandbox Code Playgroud)


dev*_*fan 18

请参阅之前处理的C运算符优先级 []*

这意味着

(num+1)[1]
*((num+1)+1)
*(num+2)
Run Code Online (Sandbox Code Playgroud)

与附加内容*(未在我的示例中编写)一起,
它变得与第二件事相同.