C语言指针经典面试题

文章详细分析了一段C语言代码,涉及指针数组、二级指针和三级指针的使用。通过解引用和指针操作,解释了代码如何打印字符串的不同部分。主要讨论了操作符的优先级和指针在内存中的指向变化。
摘要由CSDN通过智能技术生成

一.题目介绍

nt main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};//1
 char**cp[] = {c+3,c+2,c+1,c};//2
 char***cpp = cp;//3
 printf("%s\n", **++cpp);//4
 printf("%s\n", *--*++cpp+3);//5
 printf("%s\n", *cpp[-2]+3);//6
 printf("%s\n", cpp[-1][-1]+1);//7
 return 0;
}

二.题目分析

  第一句代码中是一个指针数组(存放指针的数组),数组里面四个元素,每个元素的类型为char*。每个指针指向一个字符串,其实就是指向首字符的地址,比如说c[0]中存放的是E的地址,整个字符串可以通过E的·地址找到。
  第二句代码中也是一个指针数组,数组里面有四个元素,每个元素的类型为char**,也就是二级指针,二级指针指向一级指针的地址。
  第三句代码中是一个三级指针,三级指针指向二级指针数组的首元素(数组名是数组首元素的地址,数组元素为二级指针,指向c+3)。
  printf函数会根据打印格式进行判断·,为%s,就按照字符串格式进行打印,找\0

二级指针解引用拿到二级指针内容,一级指针解引用拿到一级指针内容

三.画图分析

在这里插入图片描述

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

分析:根据操作符的优先级,++的优先级高于*(解引用),
cpp指向c+3,++cpp,cpp指向c+2,第一次解引用拿到内容c+2,第二次解引用拿到内容P,P后面内容为一个字符串,所以打印

POINT

在这里插入图片描述

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

分析:根据操作符的优先级,++,–的优先级高于*(解引用)
由于++,–会改变自身内容,cp指向c+2,而不是c+3,++cpp指向c+1,解引用拿到内容c+1,再–,注意:这里是对c+1进行–,而不是cpp,–后cp[2]内容变为c,指向发生改变,指向一维数组第一个元素,再次解引用拿到E,按照%s打印,后面还有+3,跳过三个字符,找到E,打印E后面内容。

ER

在这里插入图片描述

3. printf("%s\n", *cpp[-2]+3);
分析:这样看不清楚的话,可以理解为
*(*(cpp-2))+3,

cpp指向c+2,cpp-2,cpp指向第一个元素,解引用拿到c+3,
再次解引用拿到F,后面还有一个+3,指向字符串第三个位置S,根据输出格式,打印

ST

4. printf("%s\n", cpp[-1][-1]+1);
分析:理解为:*(*(cpp-1)-1)+1

cpp-1指向c+2,第一次解引用拿到c+2,进行减一操作,指向一维数组第一个元素,元素内容变成c+1,指向关系发生改变,指向第一个元素,解引用后拿到N,字符串加一操作,跳过一个字符,指向E,打印

EW

在这里插入图片描述

四.打印验证

在这里插入图片描述

以上代码仅供参考 如有错误请大家指点 我会尽快去改正 欢迎大家来评论~~~
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lim 鹏哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值