变量的本质是对一块内存空间的命名,我们通过引用变量名来使用这块内存空间存储的值,而指针则用来指向这些变量值所在的内存地址值。
变量值所在的内存地址的值不等于内存地址存储的变量值。
如果一个变量是指针类型,那么则可以用这个变量存储指针类型的值。
通过*指针变量来获取指针指向内存地址的变量值,我们把这种引用称之为间接引用。
切片类型:由指向数组起始元素的指针、元素数量和容量组成,所以切片与数组不同,是引用类型,而非值类型。
指针传值之所以节省内存空间:
是因为指针指向的内存地址的大小是固定的,32位机器占4字节,在64位机器上占8个字节,这与内存地址存储的值类型无关。
var声明的指针变量不能直接取值,因为他还没有分配内存地址,值为nil ,可以用new给他分配内存。
1、任意类型指针都可以被转化为unsafe.Pointer
2、unsafe.Pointer可以被转化为任何类型的指针。
3、uintptr可以被转化为unsafe.Pointer(用于转化不同类型的指针,可以和普通指针互相转化,不可以参与指针运算,但有指针语义,可保护它所指向的对象在“有用”时不会被垃圾回收),unsafe.Pointer(uintptr类型的变量)
4、unsafe.Pointer可以被转化为uintptr(是十六进制整数,表示对象地址,但没有指针的语义,用于指针运算,GC不把其当指针,其无法持有对象。uintptr类型引用的对象,没有别的引用时,对象会被回收,uintptr会被当做野地址)