热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言解题——指针解析(牛客网题目)

指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而

指针,是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语言实现一个真正的词法分析器
    词法分析,是编译器的第一个模块,也是最简单的模块。最简单,指的是相对于编译器这种大型程序而言,与一般的代码相比还是有点复杂的 ... [详细]
  • 简单数据结构模板
    一,STL1>STL中数据结构常见操作a.assign(b.begin(),b.begin()+3);b为向量,将b的0~2个元素构成的向量赋给aa.as ... [详细]
  • java 共用体_C语言 共用体(Union)详解及示例代码
    通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常 ... [详细]
  • http:www.cnblogs.comComputerGarchive201202012334898.html一:C语言中的内存机制在C语言中,内存 ... [详细]
  • flash代码_正点原子【STM32F407探索者】第三十九章 FLASH 模拟 EEPROM 实验
    1)资料下载:点击资料即可下载2)对正点原子Linux感兴趣的同学可以加群讨论:9354467413)关注正点原子公众号,获取最新资料更新 ... [详细]
  • php如何实现n的阶乘
    这篇文章主要介绍php如何实现n的阶乘,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php实现n的阶乘的方法:1、通过普 ... [详细]
  • 什么是操作符重载?一看到重载,很容易就让人联想到成员函数重载,函数重载可以使名称相同的函数具有不同的实际功能,只要赋给这些同名函数不同的参数就可以了,操作符重载也是基于这一机制的。系统为我们提供了许多 ... [详细]
  • CTF编程入门第一题 循环
    循环分值:10循环分值:10来源:北邮天枢战队难度:易参与人数:1478人GetFlag:467人答题人数:523人解题通过率:89%来源:北邮天枢战队难度:易参与人数:1478人 ... [详细]
  • 不懂性能优化,再强的计算机也白玩
    不懂性能优化,再强的计算机也白玩-Python的优秀有目共睹,不过说的性能,还真比不了Java、C、Go,有没有提升性能的技巧或方法呢?今天我们一起学习下提升Python性能的方式 ... [详细]
  • 目录一.python循环1.wuile与else连用2.死循环3while的镶嵌二.for循环1.fuo和whlie循环2.循环字符串3.循环字符4.循环元祖5.循环元组6.循环集 ... [详细]
  • 开发网站你需要知晓的部分专用术语
      越来越多的企业和个人都在拥有属于自己的网站门户,首当其冲的就是你得知晓几个网站方面的专业术语,先是中就有好多的客户不明白这些,造成误会是正常的,那不如我们对它有个大致的了解,这样就不容易感觉 ... [详细]
  • 九宫格计算. ... [详细]
  • C语言宏定义容易认不清的盲区梳理_C 语言
    宏定义是C提供的三种预处理(宏定义、文件包含、条件编译)的其中一种,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度 ... [详细]
  • Python多线程的执行顺序及状态
    importthreadingimporttimeclassMyThread(threading.Thread):defrun(self): ... [详细]
  • 本文分析和介绍了GLo ... [详细]
author-avatar
刘妤劭明馨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有