1. 程式人生 > >go 的指標理解

go 的指標理解

都說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指向的變數不同而不同—-按指標訪問稱為間接訪問

直接代表簡單—-用槍剌只能剌到對手的正面
間接代表靈活—-用三截棍卻能打到對手的背面


如果有更好的解釋再補充