操作多级(一、二、三级)指针才是我们的该有的姿态~

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 本文通过一道C语言编程题目,详细解析了多级指针的加减操作,包括二级指针和三级指针的使用,以及如何理解指针的地址计算过程,帮助读者巩固和理解指针概念。

Hello,很有缘在这篇文章上我们相遇了,那么我就用题目巩固我们多级指针的知识,当然这里的题目是比较有点难度的,我们需要有点基础呀,如果你能轻松理解题目那说明你对指针的了解已经很有基础了呢,那废话不多说,开始进入正题了~

望喜欢


操作多级指针加减题

指针加减看似简单,但有些题目却很犀利,如下题,第一次看到它我的大脑也是很混乱呢,现在已经是已经了解通透了,现在就分享给你们了,这道题可以弄出很多知识点,需要认真剖析。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
 
int main()
{
  char* arr1[] = {"abcdefg","ABCDEF","qwertyu","QWERTY"};
 
  char** arr2[] = { arr1 + 3,arr1 + 2,arr1 + 1, arr1 };
 
  char*** arr3 = arr2;
 
  printf("%s\n",**arr3+1 );
  printf("%s\n",**arr2+1 );
  printf("%s\n",*--*++arr3+3 );
  printf("%s\n", **++arr3 + 2);
 
  printf("%s\n", arr3[-2][-1]+3);
  printf("%s\n", **arr3);
  return 0;
}


我们先看一下答案吧

好,现在我们就仔细剖析,为什么计算机是这样打印的。

我们且看第一第二个打印结果的剖析:

printf("%s\n",**arr3+1 );
 printf("%s\n",**arr2+1 );

我们就来解析一下

图中其实也解析了其实arr3里储存的是arr2[0]的地址,也就是你可以把arr3等价于arr2用,所以这里的第一行和第二行是一样的结果,且arr3用两个指针就能打印字符串,这里是我们先用两个“ * ”指向到字符串“QWERTY”,后面加1是最后执行的,然后指针指向字符串的第二位,所以打印结果如WERTY”。


然后到第三行打印结果的解析:


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


图中我已经层层解析:


我们要知道++,- -和“ * ”的优先级是比较高的,所以这里我们


先++地址指向储存arr1+2的地址即arr2[1]的地址,解引用后得到(arr1+2),再到减减(- -)变成(arr1+1),再然后解引用得到“ABCDEF”字符串,最后 +3,得到字符D的地址,打印后往后打印 “DEF”


再然后是第四行打印结果的解析 :

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

因为前面代对arr3加1过,现在arr3是指向存储arr+2的地址,这里再次++,使得arr3此时指向


arr1+1的存储地址即arr2 [2] 的地址,两次解引用后得到字符串”ABCDEF“的字符”A“的地址,再加2,得到字符”C“的地址,然后再次打印得到的结果就是”CDEF“


再然后到第五行的打印结果的解析:


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

这里需要先了解一个知识点 arr3[-2] 其实等价于 *(arr3-2),目前我们arr3指向的是arr2[2]的地址即储存arr1+1的地址,那么 -2 后解引用后得到arr1+3的存储地址即arr2 [0]处的地址,然后后面就是相当于*((arr1+3)-1),括号中运算完后得到*(arr1+2)解引用后得到字符串”qwertyu“的首地址,再加3得到字符 ”r“的地址,打印后就是得到”rtyu“。


现在到最后一行,很简单我们只需要知道现在arr3指向的是arr2中的哪一处的地址,可能很多人就想上面已经指向arr2[0]的地址,那么现在打印“QWERTY” ,如果这么想那就是错误的想法了。


printf("%s\n", **arr3);


这里上面的-2,只是解引用时-2指向arr2[0]的地址,但本身并未改变arr3,所以此时arr3指向的还是arr1+1的存储地址,所以两次解引用后便是”ABCDEF“了。

目录
相关文章
|
5月前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
47 1
|
5月前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
35 1
|
5月前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
|
6月前
|
存储 安全 编译器
指针详解(内含assert断言、冒泡排序、多级指针、qsort函数的使用等等)
电脑运行是需要内存的,通俗来讲内存就相当于一个宿舍楼。电脑运行过程中,内存空间如何进行管理?电脑运行时会将内存划分为一个个房间即内存单元,每个内存单元的大小为一个字节
|
编译器 C语言
C语言指针的定义,使用,指针和指针之间的基本和关系运算,指针与数组的结合使用,二级指针及多级指针的定义和使用,指针数组和数组指针的定义和使用
C语言指针的定义,使用,指针和指针之间的基本和关系运算,指针与数组的结合使用,二级指针及多级指针的定义和使用,指针数组和数组指针的定义和使用
|
存储 C语言 C++
C多级指针与多维数组
C多级指针与多维数组
25194 2
C多级指针与多维数组
|
存储 编译器 C语言
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】(下)
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】(下)
|
存储 编译器 C语言
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】(上)
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】
|
数据安全/隐私保护
CE修改器入门:查找多级指针
本关是第6关的加强版,CE 6.X 教程中的4级指针比5.X的要简单些。多级指针就像玩解谜游戏一样,谜团不只一个,盒子中还有盒子。这里面是4级指针,游戏中也有比如8级指针,12级指针等等,思路都是一样的。
644 0
CE修改器入门:查找多级指针
|
C语言
【C语言】如何理解多级指针?
哈喽,大家好,今天这篇文章主要是带你去看一下我们在学习指针的时候的重难点,也是我们经常蒙蔽的地方,那就是指针之中的多级指针。
216 0
【C语言】如何理解多级指针?