【C语言】如何理解多级指针?

简介: 哈喽,大家好,今天这篇文章主要是带你去看一下我们在学习指针的时候的重难点,也是我们经常蒙蔽的地方,那就是指针之中的多级指针。

哈喽,大家好,今天这篇文章主要是带你去看一下我们在学习指针的时候的重难点,也是我们经常蒙蔽的地方,那就是指针之中的多级指针。30.png


再看这篇文章的时候,相信你已经对指针有了一个基础的了解,那么我们的多级指针,它就是指针的指针的指针,我们在理解这个知识的时候一定要去抽丝剥茧的逐层分析,那么我们先来看一下二级指针吧。


定义一个二级指针

int **q;

我们可以将int**q 分为两部分来看,即为 int* 和 (*q),对于后面 (*q) 中的“*”表示 q 是一个指针变量,而前面的 int* 表示指针变量 q 只能存放 int* 型变量的地址。所有对于二级指针甚至多级指针,我们都可以把它拆成两部分。首先不管是多少级的指针变量,它都是一个指针变量,指针变量就是一个“*”,其余的“*”表示的是这个指针变量只能存放什么类型变量的地址。

1.png

首先这里我们定义了一个指针p,相信大家了解过指针的都可以看明白;

2.png

那下面我们就来晋级到这一页,看在这里我们q存放的是p的地址,所以呢,我们的*q就是指向的p,那我们p是一个指针,也就是*p指向的是111这个数字,那对于q而言呢,我们就要**q才能去指向其第一个值,这也就是我们的二级指针了。


相信大家这个例子并不难理解吧!


那下面我们定义一个三级指针:


int ***p = &q ;

在这里我们要先去了解一下 & 符号,在这里我们使用的这个符号并不是按位与符号,这里我们使用的是返回变量的地址符号,也就是&a,会返回a变量的指定地址即可,对于这节的要求,我们只需要掌握那么多就可以了。

3.png

这时我们来看一下这场图,指针还是和二级类似,r存放的是q的地址,所以*r就是指向q,而q里面存放的是p的地址,所以**r就是指向了p里面的变量,而p里面存放的是111的地址,所以我们***r就是指向的111,这时我们输出***r也就是111了。


再来看 & 符号,在这里r里面存放的是q的地址,所以对q取地址也就是r内部的变量了,所以&q=r; 同理我们看p,q存放的是p变量地址,所以呢,我们对p取地址也就是q内部变量了,所以&p=q;继续来看,我们以及知道了&p是p元素地址也是我们q所指向的变量,那么&&p = &q了嘛,所以&&p也就是r内部存放的变量,也就是q的地址了。


在看完上面图解的内容后,我们再去尝试拆分查看代码。


在这里我们按照上面的方法去进行逐步拆分,  p的基类型就是 int** 型。而 q 的基类型是 int* 型,所以 &q 的基类型是 int** 型。所以 r 有三个“*”才能指向 q 的地址。三个“*”表示三级指针,即指针的指针的指针。三级指针需要三个“*”才能指向最终的内存单元。

int a = 10 ;
  int *p = &a ; //一级指针
  *p = 100 ; //*p就是a
  int **q = &p ;
  //*q就是p
  //**q就是a
  int ***t = &q;
  //*t就是q
  //**t就是p
  //***t就是a

看上面这串代码,指针变量的“基类型”用来指定该指针变量可以指向的变量的类型,即该指针变量只能存放什么类型变量的地址。所以 int*p 表示 p 指向的是 int 型变量,也就是说里面只能放int类型的变量地址。这时的p表示a的地址,而*p等于a ;


好的现在我们向下继续看,到了二级指针这里,在这里为什么我们在存放&p的时候要使用两个**呢?前面我们知道,*p是我们的int类型,p是表示的a的地址,我们在存放p时使用int*类型去存放,那么当我们存放&p的时候,就要使用int**去存放了。


那下面我们同理,由上面可知,存p应该使用int*类型,存&p应该使用int**类型,同时q也等价于&p,那么存q就要使用int**类型,所以题目中存&q就理所当然的要使用int***类型啦。那么我们反过来看,t存的是&q,那么*t就是q了;而**t也就是*q也就p了;***t也是*p也是我们一开始设定的变量a了。


所以对于多级指针我们一定要将p或者q等当作一个变量,将int*****等当作一个一个类型来看就可以了。


这也就是我们的多级指针了,也是我们在学习C语言时最大的拦路虎之一了,加油,相信你可以的!  


相关文章
|
23天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
76 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
23天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
47 9
|
23天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
41 7
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
117 13
|
26天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
26天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
93 3
|
27天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
26天前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
36 1
|
1月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
1月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。