Golang學習筆記:指針(pointer)的基本原理和使用

最後更新於 2021 年 5 月 23 日

什麼是指針

每一個變數都會被分配到一塊記憶體空間,而這個空間會有一個地址稱之為記憶體位址,這個位址就如同家裡的門牌,通過門牌才能找到你家,我們也需要通過記憶體位址來找到這塊空間內所儲存的數據。

而指針就是用來保存記憶體位址的變數

也就是說指針本身是一個變數,其值為另一個變數的位址。

下圖為這段程式碼在記憶體中保存的數據示意圖

var a = 2
var b = 5
var pa *int = &a // pa指針儲存 a 的位址
var pb *int = &b // pb指針儲存 b 的位址
point1 Golang學習筆記:指針(pointer)的基本原理和使用
注:僅為示意圖,並不代表這些變數的記憶體位址一定連續

指針的使用

指針的使用流程:

1.宣告指針變數
2.為指針變數賦值
3.訪問指針變數中指向位址的值

宣告指針

一般的指針變數聲明方式為:

var pa *type //pa是指向整數的指針型別

這個type可以是int, string, float32…等。

為指針變數賦值

在Go語言中,我們可以在變數前面加上 & 來取得該變數的記憶體位址

var a = 3
var b *int = &a
fmt.Println(a,b) //3 0xc0000140c0

b所打印出來的內容為a的記憶體位址,可以稱b為a的指針變數。

當一個指針被宣告後沒有分配到任何變數時,其值為nil
nil指針也被稱為空指針,其實就等同 null, None,都代表零值或空值。

訪問指針變數中指向位址的值

除了獲得變數的記憶體位址之外,我們還可以使用 * 取得指針變數指向的記憶體位址的值

一樣用剛才的例子

var a = 3
var b *int = &a
fmt.Println(*b) //取得b指向的a變數的記憶體位址的值 , 3

指針應用

改變 p 的值而改變 a 的值

請觀察下方的程式碼,我們應該如何做到修改 p 的值進而改變 a 的值?

func changeValue(p int){
	p = 10
}

func main(){
	var a int = 1
	changeValue(a)
	fmt.Println("a = ", a) //1
}

沒錯,就是指針。

我們可以利用指針,將程式碼改為這樣:

func changeValue(p *int){ //p是指向整數的指針類型
	*p = 10 //改變當前p所指向空間的值
}

func main(){
	var a int = 1
	changeValue(&a) //將 a的位址傳給 p 作為值 , 現在p裡的值存的是a的位址
	fmt.Println("a = ", a)
}

我們使用 changeValue(&a) 將 a 的位址傳給changeValue函式,而 p 指針變數中存的就是 a 的記憶體位址,當我修改 *p 的值即改變當前 p 所指向位址的值,也就是將 a 改為 10。

交換兩個變數的值

a = 2 , b = 5 交換 a,b的值

package main

import "fmt"

func swap(pa *int, pb *int) {
	var temp int
	temp = *pa // temp = a位址的值 = 2
	*pa = *pb // *pa = b的位址的值 = 5
	*pb = temp // *pb = temp的值 = 2
}

func main() {
	a := 2
	b := 5

	swap(&a, &b)

	fmt.Println("a = ", a, " b = ", b) // 5 2
}
0 0 評分數
Article Rating
訂閱
通知
guest

0 Comments
在線反饋
查看所有評論