1.什么是地址
传统生活中,点外卖时需要填写一个地址还有一个名字,外卖小哥哥便可以根据这个地址找到你这个人。计算机中的内存也是有十六进制表示的地址的我们可以理解为:变量也是有一个地址和一个值的,我们通过这个地址便可以访问到这个变量的值。
通过上面的地址我们知道小明这个人点的是红烧猪蹄
通过计算机内存的地址我们知道变量a里面存放的是10
好的,此时我们知道了小明的地址是xx街道xx号xx室,那我们是不是也能知道变量a的地址是0x010ff950
2.什么是指针
在生活中,不仅存在点外卖的人,也存在偷外卖的小偷啊,比如小黑。我们看下面这一个图片:
我们可以看到,有一个小偷叫小黑家住在YY街道YY号YY室(小偷也是有家的人捏),可是他不点外卖,他心里悄悄记下来小明家的地址,这样他就可以找到小明家,然后偷了小明点的红烧猪蹄。
同样的,对于指针变量,我们也可以这样理解,我们一起看下图,你可以先想想它表示什么含义
你一定想到了,指针变量a家住在计算机内存中的0x020ff000,他的心里悄咪咪记下的是变量a的地址0x010ff950。这样指针变量a就可以偷偷访问变量a的值了捏。
3.指针变量的定义
基本形式:
var *标识符 类型标识符
类型标识符表明了这是一个什么类型的指针,比如你定义的小偷是偷外卖的,那他就专一的偷外卖;如果你定义的小偷是偷钱的,那他就专一的偷钱;标识符表示这个类型的指针的名字,比如偷外卖这个叫小黑,偷钱那个叫小哈;
代码实例:
var *p1 int
var *p2 float64
var *p3 uint32
显然:名叫p1的指针变量,是一个专门指向int的指针。其余两个类同
4.取值符和取地址符
&是取地址符
*是取值符
什么意思呢?我们想想之前的例子,小黑是不是要知道小明家的地址才能去偷小明家的红烧猪蹄啊。那怎么样才能知道呢,我们就可以使用&取地址符,把小明家的地址告诉小黑。
那同样的我们可以这样使用:
var *p1 int =&a
这样我们是不是就把a的地址告诉int型指针p1了啊!
那么问题来了,小黑知道了小明家的地址,怎么样才能通过这个地址知道小明点的是红烧猪蹄呢,我们可以使用*取值符,把小明点的什么告诉小黑。
那同样的我们可以这样使用:
fmt.Println(*p1)
这样我们就知道了小黑知道的那个小明家的地址里是什么外卖,也就是知道了p1这个指针变量指向的变量a的值是什么。
聪明的你可以猜猜以下式子表示什么意思:
&p1
这个不就是直接告诉小黑家的地址嘛,就是直接取指针变量的地址
*a
这个不就是直接告诉小明点的什么嘛,就是变量a的值