golang-指針類型

指針類型

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

變量和內(nèi)存地址

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

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

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

數(shù)據(jù)類型

值類型

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

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

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

指針類型(引用類型)

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

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

b 是值類型,它指向的是內(nèi)存地址上的值

a是指針類型,它指向的是b的內(nèi)存地址

指針類型的定義

指針類型定義,語法: 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的值

之前學(xué)過的切片是引用類型

內(nèi)存的分配

make?來分配引?類型的內(nèi)存,?如 map、slice以及channel

new?來分配除引?類型的所有其他類型的內(nèi)存,?如 int、數(shù)組等

值類型和指針類型的拷貝

值類型的拷貝是深度拷貝,會將給拷貝的值創(chuàng)建一個新的內(nèi)存空間,存儲值

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

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

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

d就相當(dāng)于把a內(nèi)存地址上值,在內(nèi)存中從新開辟了一塊空間存儲,d和a互不影響

b,c相當(dāng)于指向了a的內(nèi)存地址,當(dāng)使用*號引用出內(nèi)存地址上的變量上,修改值得,a的值也會跟著改變

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容