指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。


题目场景:

下列代码输出是()

char *a[] = {"BEIJING", "SHENZHEN", "SHANGHAI", "GUANGZHOU"};
char **pa[] = {a+3, a+2, a+1, a};
char ***ppa = pa;
int main(void) {printf("%s, ", **++ppa);printf("%s, ", *--*++ppa+3);printf("%s, ", *ppa[-2]+3);printf("%s", ppa[-1][-1]+1);
}

答案输出

SHANGHAI, JING, NGZHOU, HENZHEN

原因分析:

  • 由于 pa  本身为一个常量指针,而且其类型为 char **  ,所以 pa 是一个三级指针,依次执行输出语句,

printf("%s, ", **++ppa);

在C语言中,++ 前缀递增递减和 * 优先级相同,从右到左;后缀递增递减比前缀优先级高,从左到右;

所以在该语句中,程序先执行

++ ppa

ppa 自增,指向改变,向后移动一位,偏移量为 char **,指向 pa[1] 。

*++ ppa

取出 pa[1] 的内容,pa[1] 又指向了 a[2] 的地址。

**++ ppa

取出 a[2] 的内容,a[2] 又指向字符串 "SHANGHAI",所以输出 SHANGHAI

  • 运算符优先级:++/-- 优先级大于 + ,且 + 的结合性是从左往右

printf("%s, ", *--*++ppa+3);

由于在C语言中,++/-- 优先级大于 +,由上面可得出

++ ppa

在上一次操作中,函数中已经改变了 ppa 的指向为 pa[1],所以在这次操作中,其指向改变,向后继续移动一位,指向 pa [2] 。

*++ ppa

取出 pa[2] 的内容,pa[2] 又指向了 a[1] 的地址。

--*++ ppa

当对其进行 -- 操作时,由于指向了 a[1] 的地址,从 a[1] 向前移动一个 char * 的大小,指向 a[0]。

*--*++ ppa

取出 a[0] 的内容,a[0] 又指向字符串 "BEIJING",所以输出 BEIJING

*--*++ ppa +3

由于其输出 BEIJING ,对其 +3 使得指针向后移动 3 位,指针指向 J,对其进行输出,得到 JING

  • ppa[-2] 等价于 *(ppa-2)

printf("%s, ", *ppa[-2]+3);

根据上面的可知,ppa  此时指向 pa+2 ,执行 ppa[-2],(ppa+2)-2 = ppa,故 ppa 指向 pa 的首地址,即指向 pa[0] 的地址。

*ppa[-2]

取出 a[3] 的内容,a[3] 又指向字符串 "GUANGZHOU",所以输出 GUANGZHOU

*ppa[-2] +3

由于其输出 GUANGZHOU,对其 +3 使得指针向后移动 3 位,指针指向 N,对其进行输出,得到 NGZHOU.。

  • ppa[-1][-1]等价于*(*(ppa-1)-1),ppa[-1] 等价于 *(ppa-1)

printf("%s", ppa[-1][-1]+1);

经过前面的操作, ppa 此时指向 pa[2] 。

当执行 ppa[-1] ,相当于 *(ppa -1)。所以其将会指向数组 pa[1] 。取出内容 pa[1] ,pa[1] 又指向 a[2]

ppa[-1][-1]   等价于 *(ppa[-1]-1)

在向前移动一次,移动后指向 a[1] ,取出内容 a[1] 的内容,a[1] 又指向字符串 SHENZHEN

ppa[-1][-1]+1

由于其输出 SHENZHEN,对其 +1 使得指针向后移动 1 位,指针指向 H,对其进行输出,得到 HENZHEN。

C语言解题——指针解析(牛客网题目)相关推荐

  1. c语言刷题(牛客网)

    c语言刷题(牛客网100道基础题) 学习没有捷径,唯有重复多练,这是浩克为大家找的牛客网刷题资源,如果你正在学或者学完了都可以来检验一下自己能力. 浩克也会专门开个专栏来讲解c语言刷题,让大家对c语言 ...

  2. 牛客网题目——替换空格

    牛客网题目--替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20 ...

  3. 【牛客网题目详解】Q-前天是哪一天

    链接:https://ac.nowcoder.com/acm/contest/46295/Q 来源:牛客网 题目描述 给定公元2000年到公元3000年之间的某一天,请你给出该天的前天是哪一天. (此 ...

  4. 牛客网题目——不用四则运算符号,计算两个数字的和

    牛客网题目--不用四则运算符号,计算两个数字的和 这道题的关键在于理解二进制如何执行两个数的加和操作. 二进制每位相加就相当于各位做异或操作:因此解法大致可以分为两步: 第一步:相加各位的值(下一步再 ...

  5. 链接:https://ac.nowcoder.com/acm/problem/22228来源:牛客网题目描述 在给定的数组中删除一个数。输入描述:多组测试。每组第一行输入1个整数n(n

    链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 在给定的数组中删除一个数. 输入描述: 多组测试. 每组第一行输入1个整数n(n<20), 第二行输入n个整数 第三行输入1 ...

  6. 【C语言刷题】牛客网编程入门130精选题目(二)

    牛客网编程入门130题–精选(二) 本篇文章衔接博客:牛客网编程入门130–精选(一) 文章目录 牛客网编程入门130题--精选(二) 题目OJ链接 1.图形相似度 2.有序数组中插入一个数 3.有序 ...

  7. 牛客网获取输入rowinput_Python爬虫入门例题:抓取牛客网题目

    最近做题的时候要写一些题解,在把牛客网的题目复制下来的时候,数学公式的处理比较麻烦,所以我用Python的selenium.urllib.request和BeautifulSoup4库对题目信息进行了 ...

  8. 使用Python网络爬虫抓取牛客网题目

    文章目录 1. 背景 2. 前期准备 3. 获取网页内容 4. 内容处理 4.1. Limit 4.2. Problem Description 4.3. Input 4.4. Output 4.5. ...

  9. 【牛客网题目】Java字符串专项

    目录 写在前面 知识回顾 题目重现 题目1 题目2 题目3 题目4 题目5 题目6 题目答案 题目1解析 题目2解析 题目3解析 题目4解析 题目5解析 题目6解析 写在后面 写在前面 通过专项练习, ...

最新文章

  1. 另一种的SQL注入和DNS结合的技巧
  2. TCP/IP协议学习之TCP、IP篇
  3. android r 编译找不到头文件_kOS(1):编译
  4. ASP.NET Core WebListener 服务器
  5. 开学啦!你还焦躁吗?
  6. 红帽Redhat网络功能虚拟化产品指南、规划和配置指南
  7. 【海洋女神原创】Installshield脚本拷贝文件常见问题汇总
  8. BP神经网络预测(人口)程序(matlab)
  9. linux下制作u盘启动光盘,用SYSLINUX做启动U盘、光盘
  10. uiautomatorviewer链接不到android模拟器 报Error while obtaining UI hierarchy XML file: com.android
  11. [数据仓库复习] —— 维度数据模型
  12. SSL常见错误及解决方法
  13. ORA-29491: invalid table for chunking 错误记录
  14. 【PaddlePaddle】【论文复现】U-GAT-IT
  15. matlab 图像二值化 后0、1像素的个数统计
  16. 汉澳sinox2019操作系统AI企业版发布
  17. 京东X无人超市落户西安大雁塔 全球首个5A景区店诞生
  18. PostgreSQL PRIVILEGES(权限)
  19. 如何设置自增主键列(历史遗留问题解决)
  20. 怎么用 FEBE 还原 Firefox 设置?[ZT]

热门文章

  1. netty 序列化工具类 protostuff
  2. 猜数游戏c语言程序流程图,C语言程序设计之猜数游戏.ppt
  3. 关于pcl生成的点云图颠倒的问题
  4. 关于京东技术,你想了解的都在这里丨征文活动获奖及优秀专栏推荐
  5. 【惊爆】中国移动网上营业厅出现重大BUG
  6. 基于SSM框架的音频分享平台的设计与实现计算机毕业设计源码74192
  7. 使用Istio Service Mash管理微服务
  8. 爱因斯坦在63岁时说
  9. Vuex是什么?什么时候用?怎么用?
  10. uniapp点击按钮防抖