簡單示例
package mainimport "fmt"func main() {var num int = 100var p *int = &num // 指向int類型的指針fmt.Println(*p) // 解引用,輸出 100*p = 200 // 通過指針修改原變量fmt.Println(num) // 輸出 200
}
package mainimport "fmt"func main() {a := 10var p *int // 聲明一個指向int的指針pp = &a // p存儲a的內存地址(p指向a)fmt.Println("a的值:", a) // 輸出:a的值:10fmt.Println("a的地址:", &a) // 輸出:a的地址:0xc00001a0a8(地址值可能不同)fmt.Println("p存儲的地址:", p) // 輸出:p存儲的地址:0xc00001a0a8(和a的地址相同)fmt.Println("p指向的值:", *p) // 輸出:p指向的值:10(通過指針訪問a的值)// 通過指針修改a的值*p = 20fmt.Println("修改后a的值:", a) // 輸出:修改后a的值:20
}
函數中使用指針
如果想在函數內部修改外部變量的值,需要傳遞指針:
package mainimport "fmt"// 傳遞指針參數
func addOne(p *int) {*p = *p + 1 // 修改指針指向的變量的值
}func main() {x := 5addOne(&x) // 傳遞x的地址fmt.Println(x) // 輸出:6(x的值被函數內部修改了)
}
數組指針的基本用法
數組指針:
可以直接通過指針修改數組元素(Go 會自動解引用),但無法改變數組的長度(數組長度固定)。
package mainimport "fmt"func main() {// 定義一個數組arr := [3]int{10, 20, 30}// 聲明一個數組指針,指向arrvar p *[3]int = &arr// 打印指針存儲的地址(數組的地址)fmt.Println("數組地址:", p) // 類似 0xc00001a0c0// 通過指針訪問數組元素(兩種方式都可以)fmt.Println(p[0]) // 直接用指針[索引],輸出 10fmt.Println((*p)[1])// 先解引用再訪問,輸出 20(和上面效果一樣)// 通過指針修改數組元素p[2] = 300fmt.Println(arr[2]) // 輸出 300,原數組被修改了
}
切片指針:
需先解引用指針才能操作切片元素,且可以修改切片的長度、容量或底層數組(通過?append
?等操作)。
s := []int{1, 2, 3}
p := &s // 切片指針 *[]int
(*p)[0] = 100 // 必須解引用才能修改元素(不能直接 p[0])
*p = append(*p, 4) // 修改切片本身(長度變為4)
fmt.Println(s) // 輸出 [100 2 3 4]
函數中使用數組指針
package mainimport "fmt"// 接收數組指針參數
func modifyArray(p *[3]int) {p[0] = 100 // 修改數組第一個元素
}func main() {arr := [3]int{1, 2, 3}modifyArray(&arr) // 傳遞數組的地址fmt.Println(arr) // 輸出 [100 2 3],原數組被修改
}
** 指針的指針
func main() {num := 10p := &num // 一級指針(*int)pp := &p // 二級指針(**int)**pp = 20 // 通過二級指針修改原變量fmt.Println(num) // 輸出 20
}
123