12、关于*(p+i) [j] 和 (*(p+i))[j] 的区别

今天遇到了这样一道题目:

若有一下定义:
    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]的元素值。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值