golang第七天,語言指針

這是我參與8月更文挑戰的第7天,活動詳情查看:8月更文挑戰golang

指針的概念

程序在內存中存儲它的值,每一個內存塊都有一個地址,而存儲這個地址的變量被稱爲指針變量,指針markdown

一般用十六進制數表示,如:0x6b0820或0xf84001d7f0post

一個指針變量能夠指向任何一個值的內存地址,它指向的那個值的內存地址,在32位機器上佔用4個字節,在64位機器上佔用8個字節,而且與它所指向的值的大小無關。編碼

指針能夠指向任何類型的值,可是使用時指定指針的類型在實際編碼中具備重要意義 在指針類型前面加上*號用來獲取指針所指向的內容spa

使用一個指針引用一個值被稱爲間接引用操作系統

總結:指針

  • 主要用於管理內存
  • 指針是一個特殊的變量
  • 存儲的是另外一個變量的內存地址
  • 指針是存儲另外一個變量的內存地址的變量
  • 咱們都知道,變量是一種使用方便的佔位符,用於引用計算機內存地址
  • 一個指針變量能夠指向任何一個值的內存地址它指向那個值的內存地址。

image.png

在上面的圖中,變量b的值爲156,存儲在內存地址0x1040a124。變量a持有b的地址,如今a被認爲指向b。code

指針的做用及應用場景

做用

  1. 節省內存空間,提升執行效率(當操做的數據量較大規模時)
  2. 訪問變量的值

應用場景

  1. 修改變量的值
  2. 訪問變量的值

獲取變量的地址

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是空指針
複製代碼

注意事項:

  1. 值類型通常都有對應的指針類型,格式 數據的類型 好比int-> int float64->*float64
  2. 0x開頭的十六進制的一組數據
  3. go語言中引用類型有哪些?指針,slice,map,chan,interface
  4. 值類型:變量存儲的值是值類型,一般在棧中分配
  5. 引用類型:變量存儲的是地址,這個地址對應的空間存儲的纔是實際的值,通常引用類型在堆中分配,一旦無任何變量來引用這塊空間,那麼會被操做系統進行垃圾回收。
  6. go語言的指針沒有指針運算,由於指針的亂引用會致使的內存泄漏,以及引起一連串程序的崩潰
  7. 修改指針指向變量的值,可是不會修改地址,經過指針改掉了指向變量對應的值
  8. 一個指針變量能夠指向任何一個值的內存地址
  9. 指針也能夠指向另外一個指針,而且能夠進行任意深度的嵌套,致使你能夠有多級的間接引用,但在大多數狀況這會使你的代碼結構不清晰
  10. 當一個指針被定義後沒有分配到任何變量時,它的值爲 nil。對一個空指針的反向引用是不合法的,而且會使程序崩潰

最後

剛學golang,但願你們監督而且一塊兒努力

有興趣的小夥伴,歡迎關注我訂閱號:EntrepreneurialG

相關文章
相關標籤/搜索