Golang(七) 指針

指針

指針的概念

指針是存儲(chǔ)另一個(gè)變量的內(nèi)存地址的變量阔加。

我們都知道姑荷,變量是一種使用方便的占位符街望,用于引用計(jì)算機(jī)內(nèi)存地址糜俗。

一個(gè)指針變量可以指向任何一個(gè)值的內(nèi)存地址它指向那個(gè)值的內(nèi)存地址踱稍。

在上面的圖中,變量b的值為156悠抹,存儲(chǔ)在內(nèi)存地址0x1040a124寞射。變量a持有b的地址,現(xiàn)在a被認(rèn)為指向b锌钮。

獲取變量的地址

Go 語(yǔ)言的取地址符是 &桥温,放到一個(gè)變量前使用就會(huì)返回相應(yīng)變量的內(nèi)存地址。

package main

import "fmt"

func main() {
   var a int = 10

   fmt.Printf("變量的地址: %x\n", &a  )
}

結(jié)果

變量的地址: 20818a220

聲明指針

聲明指針梁丘,*T是指針變量的類型侵浸,它指向T類型的值。

var var_name *var-type

var-type 為指針類型氛谜,var_name 為指針變量名掏觉,* 號(hào)用于指定變量是作為一個(gè)指針。

var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮點(diǎn)型 */

示例代碼:

package main

import "fmt"

func main() {
   var a int= 20   /* 聲明實(shí)際變量 */
   var ip *int        /* 聲明指針變量 */

   ip = &a  /* 指針變量的存儲(chǔ)地址 */

   fmt.Printf("a 變量的地址是: %x\n", &a  )

   /* 指針變量的存儲(chǔ)地址 */
   fmt.Printf("ip 變量的存儲(chǔ)地址: %x\n", ip )

   /* 使用指針訪問(wèn)值 */
   fmt.Printf("*ip 變量的值: %d\n", *ip )
}

結(jié)果

a 變量的地址是: 20818a220
ip 變量的存儲(chǔ)地址: 20818a220
*ip 變量的值: 20

空指針

Go 空指針 當(dāng)一個(gè)指針被定義后沒(méi)有分配到任何變量時(shí)值漫,它的值為 nil澳腹。 nil 指針也稱為空指針。 nil在概念上和其它語(yǔ)言的null、None酱塔、nil沥邻、NULL一樣,都指代零值或空值羊娃。 一個(gè)指針變量通程迫縮寫(xiě)為 ptr。

空指針判斷:

if(ptr != nil)     /* ptr 不是空指針 */
if(ptr == nil)    /* ptr 是空指針 */

獲取指針的值

獲取一個(gè)指針意味著訪問(wèn)指針指向的變量的值蕊玷。語(yǔ)法是:*a

示例代碼:

package main
import (
    "fmt"
)

func main() {
    b := 255
    a := &b
    fmt.Println("address of b is", a)
    fmt.Println("value of b is", *a)
}

操作指針改變變量的數(shù)值

示例代碼:

package main

import (
    "fmt"
)

func main() {
    b := 255
    a := &b
    fmt.Println("address of b is", a)
    fmt.Println("value of b is", *a)
    *a++
    fmt.Println("new value of b is", b)
}

運(yùn)行結(jié)果

address of b is 0x1040a124
value of b is 255
new value of b is 256

使用指針傳遞函數(shù)的參數(shù)

示例代碼

package main

import (
    "fmt"
)

func change(val *int) {
    *val = 55
}
func main() {
    a := 58
    fmt.Println("value of a before function call is",a)
    b := &a
    change(b)
    fmt.Println("value of a after function call is", a)
}

運(yùn)行結(jié)果

value of a before function call is 58
value of a after function call is 55

不要將一個(gè)指向數(shù)組的指針傳遞給函數(shù)邮利。使用切片。

假設(shè)我們想對(duì)函數(shù)內(nèi)的數(shù)組進(jìn)行一些修改垃帅,并且對(duì)調(diào)用者可以看到函數(shù)內(nèi)的數(shù)組所做的更改延届。一種方法是將一個(gè)指向數(shù)組的指針傳遞給函數(shù)。

package main

import (
    "fmt"
)

func modify(arr *[3]int) {
    (*arr)[0] = 90
}

func main() {
    a := [3]int{89, 90, 91}
    modify(&a)
    fmt.Println(a)
}

運(yùn)行結(jié)果

[90 90 91]

雖然將指針傳遞給一個(gè)數(shù)組作為函數(shù)的參數(shù)并對(duì)其進(jìn)行修改贸诚,但這并不是實(shí)現(xiàn)這一目標(biāo)的慣用方法方庭。我們有切片。

示例代碼:

package main

import (
    "fmt"
)

func modify(sls []int) {
    sls[0] = 90
}

func main() {
    a := [3]int{89, 90, 91}
    modify(a[:])
    fmt.Println(a)
}

運(yùn)行結(jié)果:

[90 90 91]

Go不支持指針?biāo)惴ā?/p>

package main

func main() { 
  b := […]int{109, 110, 111} 
  p := &b 
  p++
 }

nvalid operation: p++ (non-numeric type *[3]int)

指針數(shù)組

package main

import "fmt"

const MAX int = 3

func main() {

   a := []int{10,100,200}
   var i int

   for i = 0; i < MAX; i++ {
      fmt.Printf("a[%d] = %d\n", i, a[i] )
   }
}

結(jié)果

a[0] = 10
a[1] = 100
a[2] = 200

有一種情況赦颇,我們可能需要保存數(shù)組二鳄,這樣我們就需要使用到指針。

package main

import "fmt"

const MAX int = 3

func main() {
   a := []int{10,100,200}
   var i int
   var ptr [MAX]*int;

   for  i = 0; i < MAX; i++ {
      ptr[i] = &a[i] /* 整數(shù)地址賦值給指針數(shù)組 */
   }

   for  i = 0; i < MAX; i++ {
      fmt.Printf("a[%d] = %d\n", i,*ptr[i] )
   }
}

結(jié)果

a[0] = 10
a[1] = 100
a[2] = 200

指針的指針

如果一個(gè)指針變量存放的又是另一個(gè)指針變量的地址媒怯,則稱這個(gè)指針變量為指向指針的指針變量订讼。

var ptr **int;
package main

import "fmt"

func main() {

   var a int
   var ptr *int
   var pptr **int

   a = 3000

   /* 指針 ptr 地址 */
   ptr = &a

   /* 指向指針 ptr 地址 */
   pptr = &ptr

   /* 獲取 pptr 的值 */
   fmt.Printf("變量 a = %d\n", a )
   fmt.Printf("指針變量 *ptr = %d\n", *ptr )
   fmt.Printf("指向指針的指針變量 **pptr = %d\n", **pptr)
}

結(jié)果

變量 a = 3000
指針變量 *ptr = 3000
指向指針的指針變量 **pptr = 3000

指針作為函數(shù)參數(shù)

package main

import "fmt"

func main() {
   /* 定義局部變量 */
   var a int = 100
   var b int= 200

   fmt.Printf("交換前 a 的值 : %d\n", a )
   fmt.Printf("交換前 b 的值 : %d\n", b )

   /* 調(diào)用函數(shù)用于交換值
   * &a 指向 a 變量的地址
   * &b 指向 b 變量的地址
   */
   swap(&a, &b);

   fmt.Printf("交換后 a 的值 : %d\n", a )
   fmt.Printf("交換后 b 的值 : %d\n", b )
}

func swap(x *int, y *int) {
   var temp int
   temp = *x    /* 保存 x 地址的值 */
   *x = *y      /* 將 y 賦值給 x */
   *y = temp    /* 將 temp 賦值給 y */
}

結(jié)果

交換前 a 的值 : 100
交換前 b 的值 : 200
交換后 a 的值 : 200
交換后 b 的值 : 100

原文:第7章-指針
作者:黎躍春

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扇苞,隨后出現(xiàn)的幾起案子欺殿,更是在濱河造成了極大的恐慌,老刑警劉巖鳖敷,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖苏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡定踱,警方通過(guò)查閱死者的電腦和手機(jī)棍潘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崖媚,“玉大人亦歉,你說(shuō)我怎么就攤上這事〕┭疲” “怎么了肴楷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)荠呐。 經(jīng)常有香客問(wèn)我赛蔫,道長(zhǎng)砂客,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任呵恢,我火速辦了婚禮鞠值,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瑰剃。我一直安慰自己齿诉,他們只是感情好筝野,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布晌姚。 她就那樣靜靜地躺著,像睡著了一般歇竟。 火紅的嫁衣襯著肌膚如雪挥唠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天焕议,我揣著相機(jī)與錄音宝磨,去河邊找鬼。 笑死盅安,一個(gè)胖子當(dāng)著我的面吹牛唤锉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播别瞭,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼窿祥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蝙寨?” 一聲冷哼從身側(cè)響起晒衩,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎墙歪,沒(méi)想到半個(gè)月后听系,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虹菲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年靠胜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毕源。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浪漠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脑豹,到底是詐尸還是另有隱情郑藏,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布瘩欺,位于F島的核電站必盖,受9級(jí)特大地震影響拌牲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歌粥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一塌忽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧失驶,春花似錦土居、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涩堤,卻和暖如春眷蜓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胎围。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吁系, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人白魂。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓汽纤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親福荸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蕴坪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Go指針理解 Go 有指針,但是沒(méi)有指針運(yùn)算逞姿。你不能用指針變量遍歷字符串的各個(gè)字節(jié)辞嗡。在 Go 中調(diào)用函數(shù)的時(shí)候,得...
    不屈真實(shí)閱讀 774評(píng)論 0 2
  • 一滞造、用處 參考為什么要有指針续室?指針究竟是什么?是地址谒养?還是類型挺狰?指針究竟有什么用? 1.變量一個(gè)東西在內(nèi)存里面买窟,而...
    合肥黑閱讀 1,071評(píng)論 0 0
  • 使用 Golang 的開(kāi)發(fā)者都知道丰泊,Go 語(yǔ)言里有指針的概念,它比 C++ 的指針要簡(jiǎn)單的多始绍,同時(shí)你需要記住一個(gè)概...
    chjxidian閱讀 3,012評(píng)論 1 2
  • 轉(zhuǎn)載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,143評(píng)論 1 5
  • 一瞳购、指針 1.1 指針的概念 指針是存儲(chǔ)另一個(gè)變量的內(nèi)存地址的變量。 我們都知道亏推,變量是一種使用方便的占位符学赛,用于...
    Venture_Mark閱讀 135評(píng)論 0 0