多级指针运算

今天看到一道题目,研究了好一会儿终于高明白了,在这里拿出来和大家分享一下:

大家可以先行计算一下。
#include <stdio.h>

char *c[] = { "ENTER", "NEW", "POINT", "FIRST" };
char **cp[] = { c + 3, c + 2, c + 1, c };
char ***cpp = cp;

int main(void)
{
    printf("%s ", **++cpp);
    printf("%s ", *--*++cpp + 3);
    printf("%s ", *cpp[-2] + 3);
    printf("%s\n", cpp[-1][-1] + 1);
    return 0;
}

那么究竟输出的结果是什么呢?
POINT ER ST EW
不知道小伙伴们有么有做对
接下来就是对答案的分析:

1printf("%s ", **++cpp);//"POINT"

    cpp=cp  cpp的值就是数组cp的首地址,即存储c+3这块空间的地址。
    ++cpp   即cpp自加一,cpp的值为存储c+2这块空间的地址
    **++cpp   即*(c+2),即POINT的首地址


(2printf("%s ", *--*++cpp + 3);//ER

    ++cpp  cpp的值为存储c+1这块空间的地址
    *++cpp  拿到的就是数组cp的成员c+1
    --*++cpp  即--(c+1),数组cp的第三个成员变为c
    *--*++cpp+3*c+3,就是ER的首地址


(3printf("%s ", *cpp[-2] + 3);//ST

    cpp[-2]   即*(cpp-2),cpp的值为存储c+1这块空间的地址(这块空间里的内容被改成了c),结果就是拿到c+3
    *cpp[-2] + 3   即ST的首地址




(4printf("%s\n", cpp[-1][-1] + 1);//EW

    cpp[-1]  即*(cpp-1),cpp的值为存储c+1这块空间的地址(这块空间里的内容被改成了c),结果就是拿到c+2
    cpp[-1][-1]  即*((c+2)-1),拿到NEW的首地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值