什么是指针哇?……搜嘎,原来这么简单 | 青训营笔记

184 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

😆在这里,我对指针做了个小讲解

还是一样,如果你全知道

image.png

😊如果有小伙伴能想到更多知识,欢迎大家在评论区留言,那么我们就开始吧

👩‍💻👨‍💻哟西,一个棕~

😎😎😎我是小小分割线

指针的介绍

问:那dreams,我们要学习的指针是什么吖?

答:它是一种数据类型,仅此而已,和int、uint是同一种东西

问:这么简单吗,就是用来开辟空间存放数据的吗?

答:是的,但是它可不一般呐

问:有什么不一般的呢?

答:因为它存放的东西不一般。我们先来看一下它为什么会存在吧

这里引出一个问题给大家

在只能值传递的情况下,我们该如何做到引用传递呢?

😎😎😎是我是我,我是小小分割线

这边先来介绍一下值传递引用传递

我们就用一个生活中的例子来介绍一下吧

当我们要在一份学习资料上涂写注释时,我们有两种方式

  1. 在电子原文件上修改,此时如果保存了,那么那份注释就一直在上面了

  2. 亦或者我们可以打印下来,在纸质文件上注释,这样原文件并没有受到影响

此时第一种就是引用传递的效果,第二种就是值传递的效果

那我们来分析一下两者的区别

第一种情况时,我们直接在原文件上修改,优点是节约了打印用的纸,而且原文件发生了改变

第二种情况时,我们打印出来并修改了,我们花费了一份纸,而且原文件越大,我们的花费就越多,而且原文件没用发生改变

那我们就知道了二者的使用情景

使用场景:

需要修改原件,亦或者如果原件非常大,并且修改原件不会有损失,可以使用引用传递

需要不允许修改原件,而是仅仅想使用里面的内容,可以使用值传递


也知道了:值传递就是复制了一份给我,引用传递就是把原件给了我

那我们回到那个问题:怎么做到呢?

答:引用传递的效果不就是把原件给我吗,那你告诉我在哪里,我去拿原文件不就行了

😎😎😎又是我又是我,我是小小分割线

那我们计算机如何知道原件在哪里呢

正好,我们的计算机中

CPU和内存之间有总线连接,可以通信,那么我们就可以使用一部分总线进行这个存储的位置的传输

那么我们不就可以将原文件的位置用数据进行描述吗

我们的前辈们也是这么想的,这个位置呢就叫内存地址

每个变量在运行时都拥有一个地址

此刻我们传值,只要把这个地址给传过去,不就相当与把原文件传过去了吗

而且地址存储单元的长度是固定的,我们的消耗也不会特别大


此刻呢,我们需要一个能够保存地址的类型,那么前辈们就让指针诞生了

如何获得和使用

那我们此时有了保存地址的指针

新的问题给大家

现在我们能够把地址存放到指针里

但是我们又该如何获得原件(变量)的地址呢,又怎么用指针里的地址反向的取到原件呢?

此时我们的前辈们给我们了两个操作符

&(取地址)和 *(根据地址取值)

此刻,我们就能够使用指针了

😎😎😎双是我双是我,我是小小分割线

重点再强调一下,指针也是数据类型

可以这么理解

如果有一个int类型的5在内存中是这样

地址
0x000000015

那么我们可以用&这个操作符对其操作,返回的就是它的地址,存入指针的话

这个指针就是

地址
0x000000020x00000001

当然也可以对指针&操作

就是这样了

地址
0x000000030x00000002

我们现在知道了地址,就可以使用*操作符来获取原件

我们用Golang的代码演示一下

func main() {
   a := 5

   pointer := &a

   the_pointer_of_the_pointer := &pointer

   a_pointer := *the_pointer_of_the_pointer

   num := *a_pointer

   // 输出 num =>  5
   fmt.Println("num => ", num)

}

此时我们知道指针是什么了,也学会了操作指针,也知道了值传递和引用传递的使用场景

😎😎😎叒是我叒是我,我是小小分割线

都用心看到这里了,那就求个赞吧😘

🥳🥳🥳如果小伙伴有其他的小知识,一定不要忘了在评论区讨论哟,多多讨论,生态才会越来越好