IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言解题——指针解析(牛客网题目) -> 正文阅读

[C++知识库]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++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:49:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 16:07:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码