Go 語(yǔ)言的取地址符是 &,放到一個(gè)變量前使用就會(huì)返回相應(yīng)變量的內(nèi)存地址。以下實(shí)例演示了變量在內(nèi)存中地址:
func main() {
var a int = 10
fmt.Printf("變量的地址 = %x",&a)
}
解釋:
var var_name *var-type
/*
var-type 為指針類型,var_name 為指針變量名,
* 號(hào)用于指定變量是作為一個(gè)指針。以下是有效的指針聲明:
*/
1.go空指針
/*當(dāng)一個(gè)指針被定義后沒(méi)有分配到任何變量時(shí),它的值為 nil。
nil 指針也稱為空指針。
nil在概念上和其它語(yǔ)言的null、None、nil、NULL一樣,都指代零值或空值。
一個(gè)指針變量通??s寫(xiě)為 ptr。
func main() {
??????????? var ptr *int
???????????? fmt.Printf("ptr的值為:%x",ptr)
}
if (ptr != nil) {
?????????? //不是空指針
}else{
????????? //空指針
}
2.指針數(shù)組
const Max int = 3
func main() {
a := []int{10,100,200}
for i := 0; i < Max; i++ {
fmt.Printf("a[%d] = %d",i,a[i])
}
}
//輸出結(jié)果
a[0] = 10
a[1] = 100
a[2] = 200
//聲明了整形指針數(shù)組
var ptr [Max]*int
//ptr為整型指針數(shù)組。因此每個(gè)元素都指向了一個(gè)值。? 一下實(shí)例將三個(gè)整數(shù)存儲(chǔ)在指針數(shù)組中
const Max int = 3
func main() {
a :=[]int{10,200,300}
var ptr [Max]*int
for i := 0; i < Max; i++ {
ptr[i] = &a[i]? //指針地址賦值給指針數(shù)組
}
for i := 0; i < Max; i++ {
fmt.Printf("a[%d] = %d",i,*ptr[i])
}
}
//輸出結(jié)果
a[0] = 10
a[1] = 200
a[2] = 300
3.go語(yǔ)言指向指針的指針
//如果一個(gè)指針變量存放的又是另一個(gè)指針變量的地址,則稱這個(gè)指針變量為指向指針的指針變量
var ptr **int
func main() {
var a int
var ptr *int
var pptr *int
a = 3000
//指針ptr的地址
ptr = &a
//指向指針ptr的地址
pptr = &ptr
//獲取pptr的值
fmt.Printf("變量a = %d",a)
fmt.Printf("指針變量 *ptr = %d",*ptr)
fmt.Printf("指向指針的指針變量 **pptr = %d", **pptr)
}
//輸出
/*
變量 a = 3000
指針變量 *ptr = 3000
指向指針的指針變量 **pptr = 3000
*/
4.go語(yǔ)言指針作為函數(shù)參數(shù)
//Go 語(yǔ)言允許向函數(shù)傳遞指針,只需要在函數(shù)定義的參數(shù)上設(shè)置為指針類型即可。
func main() {
//定義局部變量
var a int = 100
var b int = 200
fmt.Printf("交換前的a的值 %d 交換前的b的值 %d",a,b)
//調(diào)用函數(shù)用于交換值
/*
&a指向 a變量的地址
&b指向 b變量的地址
*/
swap(&a ,&b)
fmt.Printf("交換后a的值 %d? 交換后b的值 %d",a,b)
}
func swap(x *int , y *int) {
var temp int
temp = *x? //保存x地址的值
*x = *y? ? //將y賦值給x
*y = temp? //將temp 賦值給y
}