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

简介: 指针是我们学习C语言的难点之一,其中多级指针更是让我们头疼,里面设计到很多变量地址的转换,所以今天我就用最简介的图来带你去真正的了解多级指针运行机制。

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

1.png

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

定义一个二级指针

int **q;

image.gif

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


2.png

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

33.png

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

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

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

int ***p = &q ;

image.gif

在这里我们要先去了解一下 & 符号,在这里我们使用的这个符号并不是按位与符号,这里我们使用的是返回变量的地址符号,也就是&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

image.gif

看上面这串代码,指针变量的“基类型”用来指定该指针变量可以指向的变量的类型,即该指针变量只能存放什么类型变量的地址。所以 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语言时最大的拦路虎之一了,加油,相信你可以的!

目录
相关文章
|
1月前
|
存储 C语言
【C语言篇】深入理解指针3(附转移表源码)
【C语言篇】深入理解指针3(附转移表源码)
37 1
|
6月前
|
存储 C语言
C语言顺序设计结构
C语言顺序设计结构
30 1
|
存储 程序员 C语言
C语言中指针的作用与使用技巧
C语言中指针的作用与使用技巧
393 1
|
程序员 C语言 C++
C语言基础-基础指针
C语言基础-基础指针
91 0
|
C语言 计算机视觉
栈的概念及结构(C语言实现栈)
栈的概念及结构(C语言实现栈)
124 0
|
存储 C语言
c语言分层理解(c语言指针(上))
1.指针是什么? 指针是内存中的一个最小单元的编号,也就是地址。
105 1
|
C语言
(用0基础的思维让你理解指针和结构体)初识C语言(0基础开始)五
(用0基础的思维让你理解指针和结构体)初识C语言(0基础开始)五
78 0
|
测试技术 C语言
c语言分层理解(c语言指针(下))
1.指针数组和数组指针区分 指针数组是存放指针的数组,实质上是数组。数组指针是指向数组的指针,实质上是指针。 1.1指针数组 比如int* arr[10];这里怎么理解,这里的arr[10 ]就是数组,数组中存放的是int类型的指针。
56 0
|
存储 编译器 C语言
【C语言】 详谈指针
【C语言】 详谈指针
107 0
|
存储
<栈>的概念&结构&实现【C语言版】
<栈>的概念&结构&实现【C语言版】
79 0