一、指標的相關概念說明
- 變數:是基本型別,變數存的就是值,也叫值型別
- 地址:用於引用計算機的記憶體地址,可理解為記憶體地址的標籤,通俗一點講就是一間房在小區裡的門牌號。如下圖①
- 指標:指標變數存的是一個地址,這個地址指向的空間存的才是值(表示地址的指向,指標是一個指向另一個變數記憶體地址的值)。如下圖②
- &:取地址符,例如:{指標}:=&{變數}。如下圖②
- * :取值符,例如:{變數}:=*{指標}。如下圖②
圖①
圖②
二、指標的使用案例
指標使用流程:
- 定義指標變數。
- 為指標變數賦值。
- 訪問指標變數中指向地址的值。
在指標型別前面加上 * 號(字首)來獲取指標所指向的內容。
案例一
package main import "fmt" func main() { var a int= 10 /* 宣告實際變數 */ var ip *int /* 宣告指標變數 */ ip = &a /* 指標變數的儲存地址 */ fmt.Printf("a 變數的地址是: %x\n", &a ) /* 指標變數的儲存地址 */ fmt.Printf("ip 變數的儲存地址: %x\n", ip ) /* 使用指標訪問值 */ fmt.Printf("*ip 變數的值: %d\n", *ip ) }
a變數的地址是:0xc042052058 ip變數的儲存地址是0xc042052058 *ip變數的值是:10
案例二
package main import "fmt" // 我們用兩個不同的例子來演示指標的用法 // zeroval函式有一個int型別引數,這個時候傳遞給函式的是變數的值 func zeroval(ival int) { ival = 0 } // zeroptr函式的引數是int型別指標,這個時候傳遞給函式的是變數的地址 // 在函式內部對這個地址所指向的變數的任何修改都會反映到原來的變數上。 func zeroptr(iptr *int) { *iptr = 0 } func main() { i := 1 fmt.Println("initial:", i) zeroval(i) fmt.Println("zeroval:", i) // &操作符用來取得i變數的地址 zeroptr(&i) fmt.Println("zeroptr:", i) // 指標型別也可以輸出 fmt.Println("pointer:", &i) }
initial: 1 zeroval: 1 zeroptr: 0 pointer: 0xc042052058
空指標
package main import ( "fmt" ) func main(){ //下面一行程式碼註釋就是空指標,那麼值為0 var a int = 1 var ip *int = &a fmt.Printf("ip的值為:%x", ip) if (ip == nil) { fmt.Printf("是空指標") } else { fmt.Printf("非空指標") } }