这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
😆在这里,我对指针做了个小讲解
还是一样,如果你全知道
😊如果有小伙伴能想到更多知识,欢迎大家在评论区留言,那么我们就开始吧
👩💻👨💻哟西,一个棕~
😎😎😎我是小小分割线
指针的介绍
问:那dreams,我们要学习的指针是什么吖?
答:它是一种数据类型,仅此而已,和int、uint是同一种东西
问:这么简单吗,就是用来开辟空间存放数据的吗?
答:是的,但是它可不一般呐
问:有什么不一般的呢?
答:因为它存放的东西不一般。我们先来看一下它为什么会存在吧
这里引出一个问题给大家
在只能值传递的情况下,我们该如何做到引用传递呢?
😎😎😎是我是我,我是小小分割线
这边先来介绍一下值传递和引用传递
我们就用一个生活中的例子来介绍一下吧
当我们要在一份学习资料上涂写注释时,我们有两种方式
-
在电子原文件上修改,此时如果保存了,那么那份注释就一直在上面了
-
亦或者我们可以打印下来,在纸质文件上注释,这样原文件并没有受到影响
此时第一种就是引用传递的效果,第二种就是值传递的效果
那我们来分析一下两者的区别
第一种情况时,我们直接在原文件上修改,优点是节约了打印用的纸,而且原文件发生了改变
第二种情况时,我们打印出来并修改了,我们花费了一份纸,而且原文件越大,我们的花费就越多,而且原文件没用发生改变
那我们就知道了二者的使用情景了
使用场景:
需要修改原件,亦或者如果原件非常大,并且修改原件不会有损失,可以使用引用传递
需要不允许修改原件,而是仅仅想使用里面的内容,可以使用值传递
也知道了:值传递就是复制了一份给我,引用传递就是把原件给了我
那我们回到那个问题:怎么做到呢?
答:引用传递的效果不就是把原件给我吗,那你告诉我在哪里,我去拿原文件不就行了
😎😎😎又是我又是我,我是小小分割线
那我们计算机如何知道原件在哪里呢
正好,我们的计算机中
CPU和内存之间有总线连接,可以通信,那么我们就可以使用一部分总线进行这个存储的位置的传输
那么我们不就可以将原文件的位置用数据进行描述吗
我们的前辈们也是这么想的,这个位置呢就叫内存地址
每个变量在运行时都拥有一个地址
此刻我们传值,只要把这个地址给传过去,不就相当与把原文件传过去了吗
而且地址存储单元的长度是固定的,我们的消耗也不会特别大
此刻呢,我们需要一个能够保存地址的类型,那么前辈们就让指针诞生了
如何获得和使用
那我们此时有了保存地址的指针
新的问题给大家
现在我们能够把地址存放到指针里
但是我们又该如何获得原件(变量)的地址呢,又怎么用指针里的地址反向的取到原件呢?
此时我们的前辈们给我们了两个操作符
&(取地址)和 *(根据地址取值)
此刻,我们就能够使用指针了
😎😎😎双是我双是我,我是小小分割线
重点再强调一下,指针也是数据类型
可以这么理解
如果有一个int类型的5在内存中是这样
| 地址 | 值 |
|---|---|
| 0x00000001 | 5 |
那么我们可以用&这个操作符对其操作,返回的就是它的地址,存入指针的话
这个指针就是
| 地址 | 值 |
|---|---|
| 0x00000002 | 0x00000001 |
当然也可以对指针&操作
就是这样了
| 地址 | 值 |
|---|---|
| 0x00000003 | 0x00000002 |
我们现在知道了地址,就可以使用*操作符来获取原件
我们用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)
}
此时我们知道指针是什么了,也学会了操作指针,也知道了值传递和引用传递的使用场景
😎😎😎叒是我叒是我,我是小小分割线
都用心看到这里了,那就求个赞吧😘
🥳🥳🥳如果小伙伴有其他的小知识,一定不要忘了在评论区讨论哟,多多讨论,生态才会越来越好