【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语言时最大的拦路虎之一了,加油,相信你可以的!  


相关文章
|
7天前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
10天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
16天前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
1月前
|
存储 编译器 C语言
【C语言篇】深入理解指针2
代码 const char* pstr = "hello world."; 特别容易让初学者以为是把字符串 hello world.放 到字符指针 pstr ⾥了,但是本质是把字符串 hello world. 首字符的地址放到了pstr中。
|
1月前
|
存储 程序员 编译器
【C语言篇】深入理解指针1
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。
|
1月前
|
存储 搜索推荐 C语言
C语言中的指针函数:深入探索与应用
C语言中的指针函数:深入探索与应用
|
1月前
|
C语言
【C语言】指针速览
【C语言】指针速览
16 0
|
1月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
|
1月前
|
C语言
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
【C初阶——指针4】鹏哥C语言系列文章,基本语法知识全面讲解——指针(4)
|
1月前
|
存储 编译器 C语言
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)
【C初阶——指针3】鹏哥C语言系列文章,基本语法知识全面讲解——指针(3)