1. 程式人生 > >golang語言學習第六課:指標

golang語言學習第六課:指標

指標?媽呀,啥玩意?是針嗎?是時鐘的指標?當然都不是,百度百科這樣解釋: 在電腦科學中,指標(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
}