C语言解题——指针解析(牛客网题目)
指针,是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语言解题——指针解析(牛客网题目)相关推荐
- c语言刷题(牛客网)
c语言刷题(牛客网100道基础题) 学习没有捷径,唯有重复多练,这是浩克为大家找的牛客网刷题资源,如果你正在学或者学完了都可以来检验一下自己能力. 浩克也会专门开个专栏来讲解c语言刷题,让大家对c语言 ...
- 牛客网题目——替换空格
牛客网题目--替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20 ...
- 【牛客网题目详解】Q-前天是哪一天
链接:https://ac.nowcoder.com/acm/contest/46295/Q 来源:牛客网 题目描述 给定公元2000年到公元3000年之间的某一天,请你给出该天的前天是哪一天. (此 ...
- 牛客网题目——不用四则运算符号,计算两个数字的和
牛客网题目--不用四则运算符号,计算两个数字的和 这道题的关键在于理解二进制如何执行两个数的加和操作. 二进制每位相加就相当于各位做异或操作:因此解法大致可以分为两步: 第一步:相加各位的值(下一步再 ...
- 链接:https://ac.nowcoder.com/acm/problem/22228来源:牛客网题目描述 在给定的数组中删除一个数。输入描述:多组测试。每组第一行输入1个整数n(n
链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 在给定的数组中删除一个数. 输入描述: 多组测试. 每组第一行输入1个整数n(n<20), 第二行输入n个整数 第三行输入1 ...
- 【C语言刷题】牛客网编程入门130精选题目(二)
牛客网编程入门130题–精选(二) 本篇文章衔接博客:牛客网编程入门130–精选(一) 文章目录 牛客网编程入门130题--精选(二) 题目OJ链接 1.图形相似度 2.有序数组中插入一个数 3.有序 ...
- 牛客网获取输入rowinput_Python爬虫入门例题:抓取牛客网题目
最近做题的时候要写一些题解,在把牛客网的题目复制下来的时候,数学公式的处理比较麻烦,所以我用Python的selenium.urllib.request和BeautifulSoup4库对题目信息进行了 ...
- 使用Python网络爬虫抓取牛客网题目
文章目录 1. 背景 2. 前期准备 3. 获取网页内容 4. 内容处理 4.1. Limit 4.2. Problem Description 4.3. Input 4.4. Output 4.5. ...
- 【牛客网题目】Java字符串专项
目录 写在前面 知识回顾 题目重现 题目1 题目2 题目3 题目4 题目5 题目6 题目答案 题目1解析 题目2解析 题目3解析 题目4解析 题目5解析 题目6解析 写在后面 写在前面 通过专项练习, ...
最新文章
- 另一种的SQL注入和DNS结合的技巧
- TCP/IP协议学习之TCP、IP篇
- android r 编译找不到头文件_kOS(1):编译
- ASP.NET Core WebListener 服务器
- 开学啦!你还焦躁吗?
- 红帽Redhat网络功能虚拟化产品指南、规划和配置指南
- 【海洋女神原创】Installshield脚本拷贝文件常见问题汇总
- BP神经网络预测(人口)程序(matlab)
- linux下制作u盘启动光盘,用SYSLINUX做启动U盘、光盘
- uiautomatorviewer链接不到android模拟器 报Error while obtaining UI hierarchy XML file: com.android
- [数据仓库复习] —— 维度数据模型
- SSL常见错误及解决方法
- ORA-29491: invalid table for chunking 错误记录
- 【PaddlePaddle】【论文复现】U-GAT-IT
- matlab 图像二值化 后0、1像素的个数统计
- 汉澳sinox2019操作系统AI企业版发布
- 京东X无人超市落户西安大雁塔 全球首个5A景区店诞生
- PostgreSQL PRIVILEGES(权限)
- 如何设置自增主键列(历史遗留问题解决)
- 怎么用 FEBE 还原 Firefox 设置?[ZT]