什么是指標
請關注原作者公眾號:Go編程時光
當我們定義一個變數 name
var name string = "Go指標"
此時,name 是變數名,它只是編程語言中方便程式員撰寫和理解代碼的一個標簽,
當我們訪問這個標簽時,計算機會回傳給我們它指向的記憶體地址里存盤的值:Go指標,
出于某些需要,我們會將這個記憶體地址賦值給另一個變數名,通常叫做prt(pointer的簡寫),而這個變數,我們稱之為指標變數,
換句話說,指標變數(一個標簽)的值是指標,也就是記憶體地址,
根據變數指向的值,是否是記憶體地址,把變數分為兩種:
- 普通變數:存資料值本身
- 指標變數:存值的記憶體地址
指標的創建
指標創建有三種方法
第一種方法
先定義對應的變數,再通過變數取得記憶體地址,創建指標
// 定義普通變數
aint := 1
// 定義指標變數
ptr := &aint
第二種方法
先創建指標,分配好記憶體后,在給指標指向的記憶體地址寫入對應的值
// 創建指標
astr := new(string)
// 給指標賦值
*astr = "Go指標"
第三種方法
先宣告一個指標變數,再從其他變數取得記憶體地址賦值給它
aint := 1
var bint *int // 宣告一個指標
bint = &aint
上面三段代碼中,指標的操作都離不開這兩個符號:
&:從一個普通變數中取得記憶體地址*:當*在賦值操作值得右邊,從一個指標變數中取得變數值,當*在賦值操作值得左邊,是指該指標指向的變數
通過下面這段代碼,你可以熟悉這兩個符號的用法
package main
import "fmt"
func main(){
aint := 1 // 定義普通變數
ptr := &aint // 定義指標變數
fmt.Println("普通變數存盤的是:",aint)
fmt.Println("普通變數存盤的是:",*ptr)
fmt.Println("指標變數存盤的是:",&aint)
fmt.Println("指標變數存盤的是:",ptr)
}
輸出如下
普通變數存盤的是:1
普通變數存盤的是:1
指標變數存盤的是:0xc0000100a0
指標變數存盤的是:0xc0000100a0
要想列印指標指向的記憶體地址,方法有兩種
// 第一種
fmt.Printf("%p",ptr)
//第二種
fmt.Println(ptr)
指標的創建
我們知道字串的型別是 string,整型是 int,那么指標如何表示呢?
package main
import "fmt"
func main() {
astr := "hello"
aint := 1
abool := false
arune := 'a'
afloat := 1.2
fmt.Printf("asgr 指標型別是:%T\n", &astr)
fmt.Printf("aint 指標型別是:%T\n", &aint)
fmt.Printf("abool 指標型別是:%T\n", &abool)
fmt.Printf("arune 指標型別是:%T\n", &arune)
fmt.Printf("afloat 指標型別是:%T\n", &afloat)
}
輸入如下,可以發現用 * + 所指向變數值的資料型別,就是對應的指標型別,
astr 指標型別是:*string
aint 指標型別是:*int
abool 指標型別是:*bool
arune 指標型別是:*int32
afloat 指標型別是:*float
所以若我們定義一個只接收指標型別的引數的函式,可以這么寫
func mytest(ptr *int) {
fmt.Println(*ptr)
}
指標的零值
當指標宣告后,沒有進行初始化,其零值是 nil,
func main() {
a := 25
var b *int // 宣告一個指標
if b == nil {
fmt.Println(b) // <nil>
b = &a // 初始化:將a的記憶體地址給b
fmt.Println(b) // 0xc0000100a0
}
}
指標與切片
切片與指標一樣,都是參考型別,
如果我們想通過一個函式改變一個陣列的值,有兩種方法
- 將這個陣列的切片作為引數傳給函式
- 將患者陣列的指標作為引數傳給函式
盡管二者都可以實作我們的目的,但是按照Go語言的使用習慣,建議使用第一種方法,因為第一種方法,寫出來的代碼更簡潔,易懂,
使用切片
func modify(sls []int) {
sls[0] = 90
}
func main() {
a := [3]int{89,90,91}
modify(&a)
fmt.Println(a)
}
使用指標
func modify(arr *[3]int) {
(*arr)[0] = 90
}
func main() {
a := [3]int{89,909,1}
modify(&a)
fmt.Println(a)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/106323.html
標籤:其他
