溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何徹底理解Go指針

發(fā)布時(shí)間:2021-11-25 21:37:36 來(lái)源:億速云 閱讀:141 作者:柒染 欄目:編程語(yǔ)言

如何徹底理解Go指針,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

什么是指針?

簡(jiǎn)單點(diǎn)說(shuō),指針是指向另一個(gè)地址的值。這是教科書(shū)上的解釋?zhuān)绻戕D(zhuǎn)自一門(mén)不用談?wù)撟兞康刂返拈_(kāi)發(fā)語(yǔ)言時(shí),這個(gè)解釋看上去猶如一串楔形文字,難以理解。

讓我們分解一下。

什么是內(nèi)存?

計(jì)算機(jī)內(nèi)存,即 RAM,可以被看作是一串盒子,一個(gè)接一個(gè)地排成一行。

每個(gè)盒子(或者稱為單元格)都標(biāo)有一個(gè)惟一的數(shù)字,數(shù)字按順序遞增;這是單元格的地址,其所在的內(nèi)存位置。

如何徹底理解Go指針

每一個(gè)單元格存儲(chǔ)一個(gè)值。如果你知道某個(gè)單元格的內(nèi)存地址,就可以訪問(wèn)該單元格并讀取里面的內(nèi)容?;蛘哂昧硗庖粋€(gè)值替換該單元格內(nèi)之前的值。

這都是關(guān)于內(nèi)存的知識(shí),CPU 所做的一切都是為獲取和存儲(chǔ)值到內(nèi)存單元中。

什么是變量?

編寫(xiě)一段代碼讀取儲(chǔ)存在內(nèi)存地址為 200 的值,將其乘以 3 并將結(jié)果存儲(chǔ)在內(nèi)存地址為 201 的位置,偽代碼流程如下:

  • 讀取存儲(chǔ)在內(nèi)存地址為 200 的值,并將其暫存在 CPU 中;

  • 將存儲(chǔ)在 CPU 中的值乘以 3;

  • 將存儲(chǔ)在 CPU 中的值存入內(nèi)存地址為 201 的位置;

如何徹底理解Go指針

這正是早期程序的編寫(xiě)方式。程序員將保留一個(gè)內(nèi)存位置列表,包括誰(shuí)使用它、何時(shí)使用以及存儲(chǔ)在其中的值表示什么。

很明顯,這很繁瑣而且容易出錯(cuò),這也意味著在編寫(xiě)程序期間,必須給存儲(chǔ)在內(nèi)存中的每一個(gè)可能的值分配一個(gè)地址。更糟糕的是,這種方式使得在程序運(yùn)行時(shí)動(dòng)態(tài)地將內(nèi)存分配給變量變得異常困難  -- 試想一下,如果你不得不使用全局變量來(lái)編寫(xiě)大型程序。

為了解決這個(gè)問(wèn)題,創(chuàng)造了變量的概念。變量只是一個(gè)由數(shù)字字母組成的、標(biāo)識(shí)存儲(chǔ)位置的假名。

現(xiàn)在,我們不再討論存儲(chǔ)位置,而是討論變量,這是我們?yōu)閮?nèi)存位置提供的方便記憶的名稱。之前的程序現(xiàn)在可以表示為:

  • 讀取變量 a 中存儲(chǔ)的值并將其放入 CPU 中;

  • 將其乘以 3;

  • 將結(jié)果存入變量 b;

如何徹底理解Go指針

這是同一個(gè)程序,但有一個(gè)重要的改進(jìn) — 我們不再需要直接討論內(nèi)存位置,也不再需要跟蹤它們 — 把這些繁重的工作交給編譯器處理。

現(xiàn)在,我們可以像下面這樣寫(xiě)程序:

var a = 62 var b = a * 3

編譯器將確保為變量 a 和 b 分配唯一的內(nèi)存位置,以便根據(jù)需要保存它們的值。

什么是指針?

現(xiàn)在我們已經(jīng)知道,內(nèi)存是一系列編號(hào)的單元格,而變量?jī)H僅是標(biāo)識(shí)內(nèi)存位置的昵稱,那指針是什么呢?

指針是指向另一個(gè)變量的內(nèi)存位置的值。

指針指向變量的內(nèi)存地址,就像變量標(biāo)識(shí)值的內(nèi)存地址一樣。

一起來(lái)看下這段代碼:

1func main() { 2 a := 200 3 b := &a 4 *b++ 5 fmt.Println(a) 6}

第二行代碼聲明了變量 a 且賦值 200。

如何徹底理解Go指針

接著,聲明了變量 b 并將變量 a 的地址賦值給它。記住,我們不知道變量 a 存儲(chǔ)的確切地址,但是我們?nèi)匀豢梢詫?a 的地址存儲(chǔ)在 b 中。

如何徹底理解Go指針

第四行代碼是最難理解的。變量 b 存儲(chǔ)的是變量 a 的地址,但我們又想將 a 的值加一。為了達(dá)到這個(gè)目的,必須使用解引用,通過(guò) b 獲得 a  的值。

如何徹底理解Go指針

然后將值加一,并將結(jié)果存儲(chǔ)在 b 指向的內(nèi)存位置上,即變量 a 所在的內(nèi)存位置。

如何徹底理解Go指針

最后一行代碼打印的就是 a 的值,也是加一之后的值 201。

如果你之前使用的語(yǔ)言沒(méi)有指針的概念或者每個(gè)變量都隱含指針,不要驚慌,理解變量與指針之間的關(guān)系需要時(shí)間與實(shí)踐,請(qǐng)記住這條規(guī)則:

指針是指向另一個(gè)變量的內(nèi)存位置的值。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI