画图分析魔鬼面试题

最近遇到了一道面试题,贼恐怖!

这是一道集合了数组一至三级指针操作符结合性与优先级字符串的魔鬼题目!

如果你能面不改色心不跳的完全做对,兄弟!你真滴niubility!

话不多说!上题!诸君且往下看:

题目

#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
    char* c[] = { "enter","new","point","first" };
    char** cp[] = { c + 3,c + 2,c + 1,c };
    char*** cpp = cp;
    printf("%s\n", **++cpp);   //1
    printf("%s\n", *--*++cpp+3); //2
    printf("%s\n", *cpp[-2]+3);//3
    printf("%s\n", cpp[-1][-1]+1);//4
    return 0;
}

且让小弟问一句,宁把结果得出来没?不要急着看解析,这边建议宁自己做一下,然后跳转结果,看做的对不对,然后再做一遍,如果还做不对,且容我慢慢分析!

给你指出注意事项

1. 操作符++、--的优先级比*
2. 操作符++、--会改变数据本身

int a = 0;
a++; //a = a + 1; // a由0变1
a--; //a = a - 1; // a由1变0
++a; //a = a + 1; // a由0变1
--a; //a = a - 1; // a由1变0

3. 操作符[]自带解引用效果
4. char *str = “ChioaR”中的ChioaR字符串保存在地址空间的字符常量区
5. char *str = “ChioaR”这样定义的字符指针仅仅指向ChioaR中的C,也就是说str里存着C的地址

注意事项说完了,要不考虑自己再做一下?

分析

根据以下三行代码,画出下图应该是没有问题。
绿色线条带条小斜线都表示指向。

    char* c[] = { "enter","new","point","first" };
    char** cp[] = { c + 3,c + 2,c + 1,c };
    char*** cpp = cp;

圖示
解题开始!

1

    printf("%s\n", **++cpp);

过程图解:
蓝色箭頭为本次过程路线
1
分析:首先,cpp本来指向cp[0]++后,cpp指向cp[1],再解引用,拿到了cp[1]cp[1]指向c[2],再解引用拿到c[2],c[2]里存的"point"的首地址,%s打印,结果:point。

流程如下:
流程1

2

    printf("%s\n", *--*++cpp+3);

过程图解:
红色箭頭为本次过程路线
2

分析:首先,因为上句把cpp的指向已经改了,所以……。cpp本来指向cp[1]++后,cpp指向cp[2]*后拿到了cp[2]--也就是--cp[2],导致cp[2]指向c[0],*后,拿到了c[0]c[0]指向"enter"的‘e’的地址,+3也就是c[0]+3,令c[0]指向"enter"的‘e’,%s打印,结果:er

流程如下:
流程2

3

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

过程图解:
黑色箭頭为本次过程路线,虚线表示并没改变cpp的指向
3

分析:首先,cpp指向cp[2]cpp[-2]相当于*(cp-2),拿到c[3],再解引用,拿到"first"f地址,+3拿到"first"s地址,%s打印,结果:st

流程如下:
流程3

4

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

过程图解:
橙色箭頭为本次过程路线
4

分析:首先,cpp指向cp[2]cpp[-1]相当于*(cp-1),拿到c[2],cpp[-1][-1]相当于*(c[2]-1),拿到new的n的地址,+1,拿到newe的地址,%s打印,结果:ew

流程如下:
流程4

结果

结果

附注

可能文中一些地方说的还不是很清楚,欢迎大家一起交流探讨

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值