go 的指针理解

版权声明: https://blog.csdn.net/qq_29785317/article/details/81294952

都说go指着跟 c 的比较像,其实不是很明白普通变量和指针的区别

看到有人说 其实 普通变量 是程序创造出来的,比如说 c 中

 a int 

那么在编译时 就会有 [a 地址 int] 这样来标识内存

普通变量a其实是语言本身创造了,是为了更方便的表示内存。我们对a进行访问其实就是直接对内存进行访问。至于a表示的内存的地址是多少,程序员一般不用关心。编译器会自动分配地址,也就是常说的为a分配一个地址。如果想知道a的地址也可以通过&a得知。

我的理解是 普通变量 就像是 房间(内存)外面的 门牌号(总经理室),指针就是这个房间的地址(A座701)

变量是运行时系统给这个内存起的别名,内存地址是唯一的,程序中当我想拿到这个内存的值的时候,因为知道它的别名,所以直接用别名访问就可以得到值,又或者我能知道它唯一的地址我也能得到它的值,其实是两种不同的内存访问方式,但是变量是会变的,地址是不会变的。比如在go中

package main

func main(){
    a := 10   //此时有一块内存存放了10,它的地址由系统自动分配,别名是a
    a = 20   //内存存放的10变成了20
    var p *int
    p = &a   //或者直接写 p := &a
    //上面的p是一个指针,通过 *p 的方式同样可以访问 变量a指向 的内存

    /*当你动态申请内存的时候,指针的存在意义之一就被体现出来了*/ 
    ptr := new(int)   
    //申请了一块内存空间,没有办法指定别名,new()返回内存地址,用指针接收
    //此时并没有变量能直接指向这块内存,所以只能通过内存地址来访问
}

看到有个解释还可以,是说指针和普通变量区别的


1+2这个表达式永远得值3
a+b这个表达式只依赖于a,b的值—–按名字访问称为直接访问
*p + *q 这个表达式的值随着p,q指向的变量不同而不同—-按指针访问称为间接访问

直接代表简单—-用枪剌只能剌到对手的正面
间接代表灵活—-用三截棍却能打到对手的背面


如果有更好的解释再补充

猜你喜欢

转载自blog.csdn.net/qq_29785317/article/details/81294952
今日推荐