(C语言)指针运算 习题练习1.2(压轴难题)

news/2025/3/31 22:30:47/

在上一张已经练习了三道习题,小试牛刀了,那么在本章在来几题,练练手。(习题三是压轴难题)

习题一 

int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 = (int*)(&aa + 1);int* ptr2 = (int*)(*(aa + 1));printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}

这里借助画图也可以更好的理解。

&aa是整个数组的地址,那么加一就是跳过整个数组,指向数组末尾之后的位置。强制转换为int*后,ptr1指向数组末尾后的地址。

看图。

 欧克,那么ptr1 - 1回退一个int的位置,指向数组最后一个元素10。那么ptr1-1就指向10

所以第一个输出10.

第二个:1.  aa在表达式中退化为int (*)[5](指向第一行的指针)。

 2.    aa + 1指向第二行的首地址(即元素6的地址)。

3.     *(aa + 1)解引用得到第二行的数组,退化为int*指向6。 

4.   ptr2 - 1回退一个int的位置,指向第一行的最后一个元素5,故*(ptr2 - 1)5。

所以本题的答案为 10,5

习题二 

#include <stdio.h>
int main()
{char* a[] = { "work","at","alibaba" };char** pa = a;pa++;printf("%s\n", *pa);return 0;
}

数组名 a 在表达式中退化为 char** 类型(指向第一个元素 a[0] 的指针)。

char** pa = a; // pa 指向 a[0]

pa 的类型是 char**,指向 a 的第一个元素 a[0](即字符串 "work" 的地址)。

pa++; // pa 移动到 a[1]
  • pa 是 char** 类型,指向 char* 元素。

  • 执行后,pa 指向数组的第二个元素 a[1](即字符串 "at" 的地址)。

  • printf("%s\n", *pa); // 输出 a[1] 指向的字符串
  • *pa 解引用 pa,得到 a[1] 的值(即字符串 "at" 的首地址)。

  • 用 %s 格式输出时,会打印从该地址开始的字符串 "at"

  • 答案为   at

习题三 

注意:此题为压轴题,请认真分析,一定一定要画图。
#include <stdio.h>int main()
{char* c[] = { "ENTER","NEW","POINT","FIRST" };char** cp[] = { c + 3,c + 2,c + 1,c };char*** cpp = cp;printf("%s\n", **++cpp);printf("%s\n", *-- * ++cpp + 3);printf("%s\n", *cpp[-2] + 3);printf("%s\n", cpp[-1][-1] + 1);return 0;
}

 答案:

POINT
ER
ST
EW

做本题首先要画图,上图。

这是在运算前的必要流程,由此图我们可以相对容易理解。

那么接下来 SHOW TIME

一:

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

 这步先找突破口,cpp,

步骤如下:

  • ++cpp:将 cpp 增加1,使其指向 cp[1]
  • *cpp:解引用 cpp,得到 cp[1],即 c + 2
  • **cpp:解引用 *cpp,得到 *(c + 2),即 "POINT"

所以结果输出 POINT

二:

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

做这道题之前可以将本题简化一下,简化后为 * --*++cpp +3

因此,第二个 printf 输出 "ER"

  • ++cpp:将 cpp 增加1,使其指向 cp[2]。(PS:在上一步已经将进行一次++cpp,所以这里初始状态就是cpp[1])
  • *cpp:解引用 cpp,得到 cp[2],即 c + 1
  • --*cpp:将 *cpp 减少1,使其指向 c,即 "ENTER"
  • *--*cpp + 3:解引用 --*cpp,得到 "ENTER",然后加上3,指向 "ENTER" 的第4个字符,即 "ER"

三: 

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

这里也可以进行一步简化,cpp[-2]:相当于 *(cpp-2):

  • cpp[-2]:由于 cpp 当前指向 cp[2],所以 cpp[-2] 指向 cp[0]
  • *cpp[-2]:解引用 cpp[-2],得到 cp[0],即 c + 3
  • *cpp[-2] + 3:解引用 *cpp[-2],得到 "FIRST",然后加上3,指向 "FIRST" 的第4个字符,即 "ST"

因此,第三个 printf 输出 "ST"

    printf("%s\n", cpp[-1][-1] + 1);
  • cpp[-1]:由于 cpp 当前指向 cp[2],所以 cpp[-1] 指向 cp[1]
  • cpp[-1][-1]:解引用 cpp[-1],得到 cp[1],即 c + 2,然后解引用 -1,得到 *(c + 1),即 "NEW"
  • cpp[-1][-1] + 1:解引用 cpp[-1][-1],得到 "NEW",然后加上1,指向 "NEW" 的第2个字符,即 "EW"

因此,第四个 printf 输出 "EW"

欧克 指针运算的习题就到这里了,大家可以在独立运算一下,更好的理解。


http://www.ppmy.cn/news/1584074.html

相关文章

香港电讯企业托管服务,助企业实现高效IT管理与运营

随着企业数字化转型的加速&#xff0c;IT基础设施的复杂性也随之增加。与此同时&#xff0c;流程保障缺失、混合办公和混合云模式、不断增加的IT需求、人力负担和运营成本的增加&#xff0c;企业如何应对这些挑战&#xff1f;为此&#xff0c;香港电讯推出的企业托管服务&#…

横扫SQL面试——事件流处理(峰值统计)问题

横扫SQL面试 &#x1f4cc; 事件流处理&#xff08;峰值统计&#xff09;问题 “会议室预定冲突怎么查&#xff1f; &#x1f50d; 服务器瞬时负载如何算&#xff1f;&#x1f3a2; 健身房的‘人挤人’高峰究竟出现在几点&#xff1f;&#x1f3c3;‍♂️” 这些看似毫不相干…

【持续集成和持续部署】

大致流程&#xff1a; 提交代码--拉取下来新代码并自动构建与部署--应用接口探活--执行自动化测试--输出自动化测试报告 一、持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09; 持续集成是一种软件开发实践&#xff0c;开发团队成员频繁地将代码集成到…

react native 0.72.5集成react-navigation

新项目需要集成react navigation直接集成了react navigation最新版本7.x安卓运行项目的时候遇到报错generateCodegenArtifactsFromSchema Failed排查问题原因&#xff1a;发现node_modules/react-native/codegen/package.json里面的version是0.77.0&#xff08;当前时刻最新的R…

【Uni-App】嵌入悬浮球全局组件的详细教程和防踩坑点

一、前言 近期接到一个业务需求是为为h5页面嵌入悬浮球&#xff0c;而且还得是全局化&#xff08;这样所有页面就可以看见了&#xff09;&#xff0c;在开发的过程中也遇到一些坑&#xff0c;在此和大家一起学习、讨论。 二、准备工作 下载悬浮球组件代码 悬浮球 - DCloud …

【10分钟掌握Docker、k8s的基础命令】

文章目录 前言一、Docker1.1 docker操作命令1.2 docker查看命令1.3 docker实战 二、kubernetes2.1 k8s基础命令2.2 k8s简单操作命令 前言 Docker介绍 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用…

批量将多个彩色的 PDF 转换为黑白色

我们在编辑 PDF 文档的时候&#xff0c;可以给 PDF 文档插入各种样式的图片&#xff0c;我们也可以给 PDF 文档中文字设置各种颜色的样式。这种 PDF 文档就是彩色的 PDF 文档。但是在某些场景下&#xff0c;比如打印需要我们可能想把彩色的 PDF 文档转换为黑白的 PDF 文档后再打…

51c嵌入式~三极管~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12208603 一、PNP与NPN两种三极管使用方法 分享这篇文章总结下关于NPN和PNP两种型号三极管的使用和连接方法。 在单片机应用电路中三极管主要的作用就是开关作用。 PNP与NPN两种三极管使用方法 上图中&#xff0c;横向左…