一、意识指针与指针类型
一个指针变量能够指向任何一个值的内存地址,它所指向的值的内存地址在 32 和 64 位机器上别离占用 4 或 8 个字节,占用字节的大小与所指向的值的大小无关。当一个指针被定义后没有调配到任何变量时,它的默认值为 nil。
每个变量在运行时都领有一个地址,这个地址代表变量在内存中的地位。Go语言中应用在变量名后面增加&操作符(前缀)来获取变量的内存地址(取地址操作),格局如下:
ptr := &v // v 的类型为 T
其中 v 代表被取地址的变量,变量 v 的地址应用变量 ptr 进行接管,v的类型为 T,ptr 的类型为T,称做 T 的指针类型,代表指针。
func TestPtr(t *testing.T) {
s := "hello ptr"
fmt.Printf("s的地址为%p ,地址的10进制示意为%d 值为%s \n", &s, &s, s)
fmt.Printf("地址的2进制示意为%b", &s)
}
输入:
s的地址为0xc0000484e0 ,地址的10进制示意为824634016992 值为hello ptr
地址的2进制示意为1100000000000000000001001000010011100000
问题1:s地址占用了几个字节?
如果咱们数一下大概有 40位二进制,那么是 5个字节?
正确答案是8个字节,咱们能够转为unsafe.Pointer而后应用size办法打印进去
func TestPtr(t *testing.T) {
s := "hello ptr"
fmt.Printf("s的地址为%p ,地址的10进制示意为%d 值为%s \n", &s, &s, s)
fmt.Printf("s地址的2进制示意为%b \n", &s)
var p unsafe.Pointer
p = unsafe.Pointer(&s)
fmt.Printf("p地址的2进制示意为%b \n", p)
size := unsafe.Sizeof(p)
fmt.Printf("p地址的大小为几个字节 %d \n", size)
}
输入为:
s的地址为0xc00008e4d0 ,地址的10进制示意为824634303696 值为hello ptr
s地址的2进制示意为1100000000000000000010001110010011010000
p地址的2进制示意为1100000000000000000010001110010011010000
p地址的大小为几个字节 8
二、unsafe.Pointer类型介绍
一、unsafe包办法简略应用
type ArbitraryType int
type Pointer *ArbitraryType
func Alignof(x ArbitraryType) uintptr
func Offsetof(x ArbitraryType) uintptr
func Sizeof(x ArbitraryType) uintptr
1.Sizeof 指针内存大小
发表回复