1. 程式人生 > >GO語言學習日記(七)指標

GO語言學習日記(七)指標

在電腦科學中,指標是程式語言中的一個物件,利用地址,它的值直接指向存在電腦儲存器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。因此,將地址形象化的稱為“指標”。意思是通過它能找到以它為地址的記憶體單元。指標的靈活性和高效給予C++經久不衰的活力,一直是大公司青睞的程式語言之一。

指標也是每個剛學程式的孩子的噩夢,在加上引用、取地址、二級指標絕對能把一群初學者嚇跑,在行業內就有精通C++的轉其他語言都非常簡單,可想而知C++的上手難度有大,有很大程度是拜指標所賜的。指標的靈活和強大的功能,也為其帶來系列麻煩的問題:空指標、野指標等等。Go語言也相中指標這個靈活高效的,保留了C和C++指標,但弱化其操作,既減少了傳值拷貝開銷,也保證了程式安全和穩定。

那麼我們用下面的程式碼簡單講講Go的指標,程式碼如下圖:


上面的程式碼先聲明瞭一個a的整型變數並且初始化數值為9,然後聲明瞭一個整形指標b,最後將a的地址賦值給b指標。第一行輸出的結果為:a的記憶體地址,以及數值9;第二行輸出的結果為:b存放了a的記憶體地址,並且b的指標指向a的記憶體單元9;第三行輸出的結果為:b的記憶體地址,以及b存放的十進位制的a的記憶體地址。

驗證結果如下圖所示:


這樣就可以推斷出,b存放的是a的記憶體地址,並且其指標指向a的記憶體單元,因此修改b儲存的記憶體地址就可以改變b指標指向的記憶體單元。

再用下面的程式碼來印證這個觀點,程式碼如下圖所示:


上面的程式碼沒有分段可能看的有點辛苦,但是不難看出,b在獲取了記憶體地址,b的指標就能針對指標指向的記憶體單元進行修改,記憶體地址的切換就能改變其指標指向的記憶體單元。因此Go語言不需要開闢新的記憶體在進行賦值後在修改其記憶體單元,指標可以獲取地址後針對記憶體單元進行修改。

眼尖的小夥伴可能看到前面兩個程式碼,b指標並沒有賦值,Go語言會給沒有賦值的指標初始化一個空值nil,下面我們來測試一下b指標是不是看空指標,程式碼如下圖所示:


Go在指標上保留了C和C++指標,但弱化其操作,既減少了傳值拷貝開銷,也保證了程式安全和穩定,在搜尋Go指標的時候發現很多很有趣的文章,有興趣的小夥伴可以自己去搜索一下來學習學習。