首页 > 其他分享 >一道C语言指针有关问题的讲解

一道C语言指针有关问题的讲解

时间:2024-12-09 19:58:32浏览次数:8  
标签:++ 讲解 C语言 char printf cpp cp 指针

原题

#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;
}
//问打印结果

问打印结果

题目考查的内容

1、指针数组

指针数组是一个包含多个指针的数组,每个元素都是一个指向特定数据类型的指针。

字符串数组: 当处理多个字符串时,指针数组非常有用。

2、指针的加减整数

在C语言中,指针不仅可以存储地址,还支持与整数进行加减运算。指针加减整数的操作实际上是基于指针所指向的数据类型的大小来进行的。

指针加整数: ptr + n,将指针 ptr 向后移动 n 个元素的大小(即移动 n * sizeof(元素类型) 字节)。

指针减整数: ptr - n,将指针 ptr 向前移动 n 个元素的大小(即移动 n * sizeof(元素类型) 字节)。

注意:指针加减整数的运算量是按指针所指向的数据类型的大小来计算的,而不是字节数。

3、多级指针

多级指针(也叫做指针的指针)是指一个指针变量指向另一个指针变量的地址,间接地指向数据。在C语言中,指针的级数表示指针指向的是其他指针的地址。常见的多级指针包括二级指针、三级指针等。每增加一层指针,我们就需要在指针类型前加上一个星号(*)。

题目分析

1、使用字符串数组来存储多个字符串的指针

char* c[] = {"ENTER","NEW","POINT","FIRST"};

这里字符串数组是一个包含多个char*类型元素的数组,每个元素指向一个字符数组。

在C语言中,字符串是以字符数组的形式存储的,并且以 \0(空字符)作为结束标志,例如题目中"ENTER"在内存中实际上是一个字符数组{'E','N','T','E','R','\0'}。

2、使用二级指针来指向字符串数组中的元素

char** cp[] = {c + 3, c + 2, c + 1, c};

这里的二级指针数组中的元素c指向的是一级指针数组c中首元素的地址,类型是char**。元素c+x则是指向一级数组指针中的第1+x个元素的地址。

3、使用三级指针来指向二级指针数组中的元素

char*** cpp = cp;

这里使用了char***类型的cpp来指向二级指针数组里的首元素。

4、用printf()函数来打印结果

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

通过指针与整数之间的运算,获得要打印的元素的地址,打印直到遇到\0。

题目解答

通过上面的题目分析,我们可以看出重点在于指针与整数之间的运算,这也是本题中最复杂的部分。

画图分析

我们通过画图分析的方式来完成指针与整数之间的运算分析。

初始状态

第一次打印时

++cpp 会让 cpp 指向 cp 的下一个元素,即 cp[1],它的值是 c + 2

**++cpp 解引用三级指针:

1、cpp 指向 cp[1],即 c + 2

2、*cpp 解引用为 c + 2

3、**cpp 解引用为 c[2],即字符串 "POINT"

输出:POINT

第二次打印时

++cpp 使 cpp 指向 cp[2],即 c + 1

*++cpp 解引用为 c + 1

--*++cpp 将指针 c + 1 减 1,变为 c

*--*++cpp 解引用为 c[0],即字符串 "ENTER"

*--*++cpp + 3 是指 "ENTER" 字符串地址加 3,得到 "ER"

输出:ER

第三次打印时

cpp[-2] 等效于 *(cpp - 2),即 cp[0],值是 c + 3

*cpp[-2] 解引用为 c[3],即字符串 "FIRST"

*cpp[-2] + 3 是指 "FIRST" 字符串地址加 3,得到 "ST"

输出:ST

第四次打印时

 

cpp[-1] 等效于 *(cpp - 1),即 cp[1],值是 c + 2

cpp[-1][-1] 等效于 cp[1][-1],即 *(c + 1),值是 "NEW"

cpp[-1][-1] + 1 是指 "NEW" 字符串地址加 1,得到 "EW"

输出:EW

答案

根据以上的分析,得到如上答案。

题目拓展

#include <stdio.h>

int main() {
    char* c[] = { "njupt", "nju", "ptnju", "t" };
    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;
}

感兴趣的可以研究一下上述代码

答案是:

总结

通过上面的题目,我们可以更加的深刻地理解C语言中的指针,为后续的高级编程打下扎实的基础。

标签:++,讲解,C语言,char,printf,cpp,cp,指针
From: https://blog.csdn.net/2402_83146415/article/details/144336402

相关文章

  • 初识C语言(指针、结构体)
    *前言学习C语言自用教材:C程序设计第五版--谭浩强线上课程:跟学博主:鹏哥C语言。视频:1.【初识C语言】认识C语言_哔哩哔哩_bilibili1.指针1.1内存内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。为了有效的使用内存,把内存划分成一个个小的内存单......
  • 洛谷 P5587 打字练习 C语言
    题目:https://www.luogu.com.cn/problem/P5587题目描述R君在练习打字。有这样一个打字练习网站,给定一个范文和输入框,会根据你的输入计算准确率和打字速度。可以输入的字符有小写字母、空格和 .(英文句号),输入字符后,光标也会跟着移动。输入的文本有多行,R君可以通过换行键来......
  • 洛谷 P8824 [传智杯 #3 初赛] 终端 C语言
    题目:https://www.luogu.com.cn/problem/P8824题目描述有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个Terminal。具体来说,它需要支持如下命令:touchfilename:如果名为 filename 的文件不存在,就创建一个这样的文件,如果已经存在同名文件的话则不进行任何操作。......
  • C语言 汉诺塔
    题目描述汉诺塔Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。......
  • C语言基础-循环结构
    循环结构什么是循环代码的重复执行,就叫做循环循环的分类无限循环(死循环):程序设计中尽量避免无限循环。程序中的无限循环必须是可控的。有限循环:循环限定循环次数或者循环的条件。循环的构成循环条件循环体当型循环的实现特点:先判断、后执行,如果条件不满足,一次都不执......
  • 2.7 指针什么时候表示值什么时候表示地址
    1. 指针表示地址-声明时:当你声明一个指针变量时,这个变量本身存储的是一个地址。例如, int*p; 这里的 p 是一个指针变量,它被用来存储一个 int 类型变量的地址。-作为函数参数传递时:当你把一个指针作为函数参数传递时,你传递的是地址。例如, voidfunc(int*ptr); 这......
  • C语言编程1.22小L的难题
    题目描述最近,小L遇到了一道难题,请你帮帮他。给出n个数,请找出这个序列的任意两个不同的数第二小的差值。ai��和aj��的差值定义为∣ai−aj∣∣��−��∣,即两个数差的绝对值,其中i�和j�互不相同。(第二小即从小到大排序之后的第二个数字)输入格式第一行为一个正整数n(3≤n≤105)�(3≤�≤105),代表数......
  • 【从0带做】基于协同过滤算法的springboot+vue的煤矿员工健康管理系统的设计与实现 【
    ✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程......
  • 指针--习题
    设计一个指针函数,可以将3×3矩阵转置transposeMatrix函数h它接收一个指向包含3个整数的数组的指针(也就是可以用来表示二维数组的一种指针形式)作为参数,这个参数指向了要进行转置操作的3×3矩阵。通过两层嵌套的for循环,实现了矩阵元素的交换来完成转置操作。内层循环从i+......
  • 城域网与数据中心互联 保姆级讲解(BGP综合选路)的配置过程及验证 HCIP大型网络设计必备
    本实验模拟某市ISP骨干网与两个数据中心互联的网络一、   实验拓扑二、   基础构思规划1.预配置包括:1.1所有设备互联IP已配置,且所有设备都有Loopback0地址。1.2SW1与SW2已创建vlan、划分vlan、并创建vlanif。1.3PC已配置IP和网关。2.在所有设备的系统......