golang-指針類型


tips: *號,可以指向指針類型內存地址上的值,&號,可以獲取值類型的內存地址

變量和內存地址

每一個變量都有內存地址,可以通過變量來操作內存地址中的值,即內存的大小

go語言中獲取變量的內存地址方法:通過&符號可以獲取變量的地址

var a int32
a = 100
fmt.Printf(“%d\n”, a)     //變量的值
fmt.Printf(“%p\n”, &a)	 //變量的內存地址

數據類型

值類型

定義:普通變量存儲的是對應類型的值,這些類型就叫值類型

var b int32
b = 156
fmt.Printf(“%d\n”, b)
fmt.Printf(“%p\n”, &b)

變量b,在內存中的地址為:0x1040a124,在這個內存地址上存儲的值為:156

指針類型(引用類型)

定義:指針類型的變量存儲的是⼀個地址,所以⼜叫指針類型或引⽤類型

var b int32
b = 156
var a *int32
a = &b

b 是值類型,它指向的是內存地址上的值

a是指針類型,它指向的是b的內存地址

指針類型的定義

指針類型定義,語法: var 變量名 *類型

 b := 255
 var a *int = &b
 fmt.Printf("Type of a is %T\n", a)
 fmt.Println("address of b is", a)

指針類型在定義完成后,默認為空地址,即空指針(nil)

操作指針類型變量

在定義好指針變量后,可以通過***** 符號可以獲取指針變量指向的變量

 b := 255
 a := &b
 fmt.Println("address of b is", a)
 fmt.Println("value of b is", *a)
 *a++
 fmt.Println("new value of b is", b)

在這里的 *a 等價於 b,通過修改 *a ,最終修改的是值類型b的值

之前學過的切片是引用類型

內存的分配

make⽤來分配引⽤類型的內存,⽐如 map、slice以及channel

new⽤來分配除引⽤類型的所有其他類型的內存,⽐如 int、數組等

值類型和指針類型的拷貝

值類型的拷貝是深度拷貝,會將給拷貝的值創建一個新的內存空間,存儲值

指針類型的拷貝是淺拷貝,拷貝后的值,指向的內存地址和原值的內存地址一樣,修改其中一個值,這個內存地址上的值都會改變

 var a int = 100
 var b *int = &a
 var c *int = b
 var d int = a
 *c = 200

這里a,d是值類型,b,c是指針類型

d就相當於把a內存地址上值,在內存中從新開辟了一塊空間存儲,d和a互不影響

b,c相當於指向了a的內存地址,當使用*號引用出內存地址上的變量上,修改值得,a的值也會跟着改變


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM