golang語言學習第六課:指標
阿新 • • 發佈:2019-01-13
指標?媽呀,啥玩意?是針嗎?是時鐘的指標?當然都不是,百度百科這樣解釋: 在電腦科學中,指標(Pointer)是程式語言中的一個物件,利用地址,它的值直接指向(points to)存在電腦儲存器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。
指標,其實翻譯的過來後,一看有點嚇唬人,指標的英文是:pointer 字面上翻譯過來是指向者的意思。
一個指標變數指向了一個值的記憶體地址。
定義指標的方法:
var 指標變數名 *指標變數型別
實際例子:
var p *int //指向整型, *號用於指定變數是作為一個指標 var fp *float32 //fp為浮點型指標
看看程式碼的實際例子吧:
package main import "fmt" func main() { var a int =2 var p *int =&a *p =3 fmt.Println(p, *p, a)
//p為指標變數,代表暫存器的地址,*p為指標指向位置的內容,通過賦值操作,改變了指標位置指向的內容資料,其實也就是改變了變數a的值。因為指標是指向a的暫存器地址的。 }
需要注意的是:golang的指標不像C語言,它是不支援指標運算的,這樣的話,學習指標就非常簡單了。
學習指標,首先要搞懂函式引數的傳遞是值傳遞還是引用傳遞
首先我們來看一段C++的程式碼:
void pass_by_value (int a) { a++; } void pass_by_ref (int& a) { a++; } int main() { int a =3; pass_by_value(a); printf("After pass_by_value: %d\n", a); pass_by_ref(a): printf("After pass_by_ref: %d\n", a");
執行結果是:3, 4 (解析:這是C++的程式碼,第一個函式引數是值傳遞,第二個函式引數是引用傳遞)
值傳遞,它做了一份拷貝, 拷貝完之後,main函式裡的值是不會變的。
引用傳遞,它不做拷貝,但是main函式裡的值,它調的函式會被它改變調。
C++程式語言是這樣的,那其他語言呢?其他語言,一般來說,所有呼叫的引數都是引用傳遞,除了系統內建的引數以外。比如說 java, python都是引用傳遞。
那麼問題來了, go語言用的是值傳遞還是引用傳遞? go語言只有一種值傳遞一種方式,沒有引用傳遞,但可以用指標。
具體看看我的練習程式碼吧:
package main import "fmt" func pass_by_point(a *int) { *a =999 fmt.Println("*a的值是:",*a) fmt.Println("----------------") } func pass_by_value(a int) { a = 888 fmt.Println("函式體pass_by_vaule內的a結果是:",a) fmt.Println("++++++++++++++++++") } func main() { var value int =777 var a int =2 var p *int =&a *p =3 fmt.Printf("p指標是:%x\n *p內容是:%d\n a的值是:%d\n _____________\n",p, *p, a) pa :=&value pass_by_point(pa) pass_by_value(value) fmt.Println("main函式裡的value值是:",value) var swap_a int =3 var swap_b int =4 swap(swap_a, swap_b) fmt.Println(swap_a, swap_b) swap_point(&swap_a, &swap_b) fmt.Println(swap_a, swap_b) swap_best(swap_a, swap_b) fmt.Println(swap_a, swap_b) } func swap (a,b int) { b, a = a, b } func swap_point (a,b *int) { *b, *a = *a, *b } func swap_best (a,b int) (int,int) { return b,a }