我正在努力学习指针,而我刚刚遇到了一些我不理解的情况。
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编译器。
答案 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)
在[]
*
这意味着
(num+1)[1]
*((num+1)+1)
*(num+2)
与附加的*
一起(未在我的示例中写入),
它变成了第二件事。