這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰golang
程序在內存中存儲它的值,每一個內存塊都有一個地址,而存儲這個地址的變量被稱爲指針變量,
指針
markdown一般用十六進制數表示,如:0x6b0820或0xf84001d7f0post
一個指針變量能夠指向任何一個值的內存地址,它指向的那個值的內存地址,在32位機器上佔用4個字節,在64位機器上佔用8個字節,而且與它所指向的值的大小無關。編碼
指針能夠指向任何類型的值,可是使用時指定指針的類型在實際編碼中具備重要意義 在指針類型前面加上*號
用來獲取指針所指向的內容spa
使用一個指針引用一個值被稱爲間接引用操作系統
總結:指針
在上面的圖中,變量b的值爲156,存儲在內存地址0x1040a124。變量a持有b的地址,如今a被認爲指向b。code
做用
應用場景
Golang語言的獲取地址符號是&,放到一個變量前使用就會返回相應變量的內存地址orm
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("變量的地址:%X\n", &a) // 變量的地址:20818a220
}
複製代碼
package main
import "fmt"
func main() {
// 先定義變量,再定義指針去取變量的地址
var num1 int = 100
fmt.Printf("變量的地址:%v\n", &num1) // 變量的地址:0xc00006c008
// 定義一個指針類型的變量,那麼這個變量存儲的就是地址,實際的值是這個地址指向的空間
// 定義一個指針類型的變量去指向num1
var num2 *int = &num1
fmt.Printf("變量的地址:%v\n", &num2) // 變量的地址:0xc00007c020
}
複製代碼
取地址操做符&
: 通常指針操做當中常常使用,&使用地址內存
取值操做符*
: 通常在指針操做中,*根據地址找該地址指向空間的值
*int
: 指向整型
*float32
:指向32位的浮點型
當一個指針被定義後沒有分配到任何變量時,它的值是nil
, nil指針
也稱爲空指針。nil在概念上和其餘語言的null,None,nil,NULL同樣,都指代零值或空值。一個指針變量一般縮寫爲ptr
空指針判斷:
if(ptr != nil) // ptr 不是空指針
if(ptr == nil) // ptr是空指針
複製代碼
- 值類型通常都有對應的指針類型,格式 數據的類型 好比int-> int float64->*float64
- 0x開頭的十六進制的一組數據
- go語言中引用類型有哪些?指針,slice,map,chan,interface
- 值類型:變量存儲的值是值類型,一般在棧中分配
- 引用類型:變量存儲的是地址,這個地址對應的空間存儲的纔是實際的值,通常引用類型在堆中分配,一旦無任何變量來引用這塊空間,那麼會被操做系統進行垃圾回收。
- go語言的指針沒有指針運算,由於指針的亂引用會致使的內存泄漏,以及引起一連串程序的崩潰
- 修改指針指向變量的值,可是不會修改地址,經過指針改掉了指向變量對應的值
- 一個指針變量能夠指向任何一個值的內存地址
- 指針也能夠指向另外一個指針,而且能夠進行任意深度的嵌套,致使你能夠有多級的間接引用,但在大多數狀況這會使你的代碼結構不清晰
- 當一個指針被定義後沒有分配到任何變量時,它的值爲 nil。對一個空指針的反向引用是不合法的,而且會使程序崩潰
剛學golang,但願你們監督而且一塊兒努力
有興趣的小夥伴,歡迎關注我訂閱號:
EntrepreneurialG