Golang數(shù)據(jù)類型之指針
目錄
1、概述
2、聲明
3、空指針
4、用指針修改值
5、指針的指針

1、概述
每個變量在內(nèi)存中都有對應(yīng)的存儲位置,也就是內(nèi)存地址
指針類型是指變量存儲的是一個內(nèi)存地址的變量類型,在golang中可以通過&運(yùn)算符獲取變量的指針
取變量指針的語法
ptr := &v // v的類型為T
// v:代表被取地址的變量,類型為T
// ptr:用于接收地址的變量,ptr的類型就為*T,稱做T的指針類型。*代表指針
2、聲明
指針聲明需要指定存儲地址中對應(yīng)數(shù)據(jù)的類型,并使用*作為類型前綴進(jìn)行指針取值
func main() {
//指針取值
a := 10
b := &a // 取變量a的地址,將指針保存到b中
fmt.Printf("type of b:%T\n", b)
c := *b // 指針取值(根據(jù)指針去內(nèi)存取值)
fmt.Printf("type of c:%T\n", c)
fmt.Printf("value of c:%v\n", c)
}
/*
type of b:*int
type of c:int
value of c:10
/*
用法歸納
對變量進(jìn)行取地址 (&)操作,可以獲得這個變量的指針變量對指針變量進(jìn)行取值 (*)操作,可以獲得指針變量指向的原變量的值指針變量的值是變量的內(nèi)存地址
3、空指針
指針變量聲明后會被初始化為nil,表示的是空指針
func main() {
var p *string
fmt.Println(p)
fmt.Printf("p的值是%v\n", p)
if p != nil {
fmt.Println("非空")
} else {
fmt.Println("空值")
}
}
還可以使用new函數(shù)進(jìn)行初始化,new函數(shù)會根據(jù)數(shù)據(jù)類型申請內(nèi)存空間并使用零值填充,并返回申請的空間地址
var a *int = new(int)
fmt.Println(&a)
fmt.Println(a) // 0xc000014330
fmt.Println(*a) // 0
// 變量的地址 指針的地址 指針的值
4、用指針修改值
exchange函數(shù)依次進(jìn)行的操作:
取
c指針的值, 賦給臨時變量t取
d指針的值, 賦給c指針指向的變量將
c指針的值賦給d指針指向的變量
func exchange(c, d *int) {
t := *c
*c = *d
*d = t
}
func main() {
a, b := 6, 8 // 準(zhǔn)備兩個變量, 賦值6和8
exchange(&a, &b) // 交換變量值
fmt.Println(a, b) // 輸出變量值
}
/*
8 6
*/
5、指針的指針
用來存儲指針變量地址的變量叫做指針的指針
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)
}
/*
變量 a = 3000
指針變量 *ptr = 3000
指向指針的指針變量 **pptr = 3000
/*
多維指針
func main() {
var a ****int
v := 10
p1 := &v // *int
p2 := &p1 // **int
p3 := &p2 // ***int
a = &p3 // ****int
fmt.Println(v, p1, p2, p3, a, ****a) // 10 0xc000114168 0xc00011e028 0xc00011e030 0xc00011e038 10
}
See you ~
評論
圖片
表情
