今天遇到了这样一道题目:
若有一下定义:
int w[2][3];
则对w数组元素非法引用是:
A、*(w[0]+2) B、*(w+1)[2] C、w[0][0] D、*(w[1]+2) E、w[1]+2
题目不难,我一开始直接选了E,因为这是对w数组元素的非法引用,单单给个地址肯定是不对的,可是后面一听讲解才知道,E是正确的,但B选项的值越界了,这就让我有点懵了,在我认为*(w+1)[2]就等于w[1][2],这是正确的啊,于是我又陷入了沉思,后面发现(*(w+1))[2]才等价于w[1][2]。意思就是*(w+1)[2]与(*(w+1))[2]是两个不同的概念。
1、w是指向二维数组行的行指针,地址为w[0],而对它的+1操作结果是地址向下移动一行;
2、方括号[]优先级是高于指针运算符*的,所以优先的运算是 (w+1)[2],这个运算同样对w+1这个地址进行+2运算,也就是(w+1)[2]=w+1+2,运算指针向下了两行,指向w[3];
3、最后进行*运算,取得是w[3][0]的元素值。