`int`数组中的输出无效

时间:2014-10-16 07:29:46

标签: c pointers

我正在努力学习指针,而我刚刚遇到了一些我不理解的情况。

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

根据我所学到的,输出应该是:

12 15

但实际上是:

15 15

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

我正在使用GCC编译器。

3 个答案:

答案 0 :(得分:24)

在您的数据中,

int num[3][2]={3,6,9,12,15,18};

相当于:

int num[3][2]={{3,6},{9,12},{15,18}};

即。

num[0][0] = 3
num[0][1] = 6
num[1][0] = 9
num[1][1] = 12
num[2][0] = 15
num[2][1] = 18

因此,

*(num+1)[1]
= *(*(num+1+1))
= num[2][0] 
=15

**(num+2))
= num[2][0]
=15

答案 1 :(得分:20)

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

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

如果我们把它拆开

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

*(*(num+2))

*(num[2])

num[2][0]

答案 2 :(得分:18)

[]

之前处理C Operator Precedence, *

这意味着

(num+1)[1]
*((num+1)+1)
*(num+2)

与附加的*一起(未在我的示例中写入),
它变成了第二件事。