筆者第一個學習的程式語言是C++,當時學得很開心~
但......碰到指標之後一個頭兩個大,當時完全搞不懂指標到你在幹嘛......
如果你是跟我一樣對指標很困擾的朋友,一起透過本文來重新學習吧~
指標簡單來說就是儲存變數的記憶體位置
,
宣告變數時電腦會配置一個記憶體位置給它,
指標就是取得變數的記憶體位。
指標的宣告方式為:var 指標名稱 *型態
、指標取得值的方法:*指標名稱
,
實際範例如下:
package main
import "fmt"
func main() {
var num int = 1 //宣告一個變數num
var pt *int //宣告一個指標
pt = &num //取得num的記憶體位置
fmt.Println("num的位置", pt)
fmt.Println("num的值", *pt)
}
輸出結果如下:
num的位置 0xc0000a2000
num的值 1
由於指標是直接取得變數記憶體的位置,
所以當我們修改指標的值,同時也是在修改變數的值,
程式的範例如下:
package main
import "fmt"
func main() {
var num int = 1 //宣告一個變數num
var pt *int //宣告一個指標
pt = &num //取得num的記憶體位置
fmt.Println("num的位置", pt)
fmt.Println("num的值", *pt)
// 透過指標可直接更動變數num的值
*pt = 2
fmt.Println("num的值", *pt)
fmt.Println("num的值", num)
//
}
輸出結果如下:
num的位置 0xc0000a2000
num的值 1
num的值 2
num的值 2
下範例練習使用指標做為參數的函式,
透過指標可以減少記憶體空間重複使用直接取得變數值,
範例如下:
package main
import "fmt"
// 函式的參數為指標
func test(pt *int) {
*pt = 3
}
func main() {
var num int = 1 //宣告一個變數num
var pt *int //宣告一個指標
pt = &num //取得num的記憶體位置
fmt.Println("num的位置", pt)
fmt.Println("num的值", *pt)
//函式的引數為指標
test(pt)
fmt.Println("num的值", *pt)
}
輸出結果:
num的位置 0xc000090000
num的值 1
num的值 3
本為雖然沒有探討的很深入,
但是透過本次練習又複習了一次指標~
覺得開心
golang 能不用指標就不用指標
謝謝分享~~
不好意思,想請問一下為何不建議使用指標~
記憶體管理的成本太高.
只有在少數狀況才會建議用指標
比如
boolean指標: true/false/nil
或是物件真的很大的時間(記憶體管理的成本小於物件複制時)
謝謝~~~
學到很重要的觀念了!!