測試 Golang 指標變數的引用傳遞

2021-10-12 05:50:12 字數 2418 閱讀 1237

首先設計乙個資料結構(golang 結構體) ******list :

type ******list struct
num 用來代表該結構的編號。

*******list 用來表示該結構體型別的指標變數,指向下乙個節點。

建立頭節點 head。

建立其它節點 node1、node2、node3。

node3 := &******list

node2 := &******list

node1 := &******list

head := &******list

fmt.println("head:", head)

fmt.println("node1:", node1)

fmt.println("node2:", node2)

fmt.println("node3:", node3)

輸出結果:

head: &

node1: &

node2: &

node3: &

建立乙個臨時節點 temp,把 head 賦值給臨時節點 temp。

移除 temp 的下乙個節點,即讓 temp 直接指向下下乙個節點,同時,直接輸出 head.next。

temp := head

temp.next = temp.next.next

fmt.println("head.next:", head.next)

輸出結果:

head.next: &
我們可以發現,head.next 並沒有指向1號節點( head 節點的下乙個節點),而是經過 temp 節點的操作後(temp.next = temp.next.next)

指向了下下乙個節點(2號節點)

那麼,為什麼 head 賦值給 temp 後,在 temp 中的操作會影響到 head 呢?

因為發生了引用傳遞,我們用示意圖來分析:

如上圖所示:

head 為 *******list 型別的指標,指標變數內存放的具體內容為:

&
0xc000006028
當我們把 head 賦值給 temp,實際上發生了如下的操作:

有乙個新的指標變數 temp 儲存了和 head 一樣的內容:

&
無論是變數 temp 還是變數 head,指向的同樣都是內容為  & 的節點。

因此無論變數 temp 對該節點做了什麼修改,用變數 head 再次指向該節點的時候,修改都會生效。

因此,我們後續再使用 head 變數來訪問該內容的時候,該內容已經指向了節點 2 。

因此當我們直接輸出 head 的下乙個節點,輸出的不是節點 1 ,而是節點 2。

完整**如下:

/*

測試 golang 指標變數的引用傳遞

*/package main

import "fmt"

type ******list struct

func main()

node2 := &******list

node1 := &******list

head := &******list

fmt.println("head:", head)

fmt.println("node1:", node1)

fmt.println("node2:", node2)

fmt.println("node3:", node3)

temp := head

temp.next = temp.next.next

fmt.println("head.next:", head.next)

fmt.println("指標變數 head 的值為:", head)

fmt.println("指標變數 temp 的值為:", temp)

}

輸出結果:

head: &

node1: &

node2: &

node3: &

head.next: &

指標變數 head 的值為: &

指標變數 temp 的值為: &

變數 指標 引用

先看一段程式 從執行結果可以看出,指標引用都可以指向變數。指標是自由的,而引用只能初始化一次,之後如果再賦值,就直接修改指向的變數,因此,引用是變數的別名 我們知道指標在32位機器上是4位元組的一種資料型別。而引用又是占用多少記憶體呢?我把程式稍作修改,比較來看看 第一種情況和第二種情況的區別在於。...

golang 利用指標匯出變數

unsafe.pointer類似c的void 在golang中是用於各種指標相互轉換的橋梁。uintptr是golang的內建型別,能儲存指標的整型,uintptr的底層型別是int,和unsafe.pointer可相互轉換。go語言是強型別語言,指標也是具有明確型別的物件,進行嚴格型別檢查,因此下...

引用 變數的別名,並非指標

引用是乙個已經存在的物件的別名。一旦乙個物件初始化了這個引用,那麼名稱和引用都能夠用來引用該物件。int a 12 int ra a ra 是物件a 的乙個別名 ra 此時物件 a 11 a 10 ra 10 int pa ra pa 指標指向物件 a引用經常與指標混淆,可能是c 編譯器常常將引用像...