说到指针,许多人感到“谈指针色变”,对指针偏移、指针运算、指针转换非常恐惧。其实,指针是C族语言(C/C++)极高性能的根本,在操作大块数据和做内存地址偏移时,方便快捷。C族语言(C/C++)中指针被诟病的原因是 指针的运算
和 内存释放
。
go中的指针分为两个重要方面:
- 类型指针。类型指针拥有指针的高效访问:传递数据使用指针,而不是采用内存拷贝;使用类型指针修改(其指针地址)指向的普通变量值。类型指针不能运算和偏移
- 切片。由指向起始元素的原始指针、元素数量和容量构成。切片比原始指针更安全高效,当切片越界时,go运行时会报panic,并打出堆栈,原始指针只能崩溃
1. 几个名词和过程
- 普通变量
初始化普通变量,类型为T。
- 取(内存)地址
使用&操作符,对普通变量取(内存)地址,得到普通变量的指针(变量)。
- 指针(变量)
对普通变量取地址后(&(普通变量)
),得到指针变量。在程序运行时,每个变量都会被分配内存,拥有内存地址。指针(变量)的值就是这个内存地址,也叫指针地址,这就是指针(变量)的本质。
注: 每个普通变量都有内存地址,指针的值就是这个内存地址。
- 指针类型
使用&(普通变量),对普通变量取(内存)地址后,得到指针变量,其类型为*T,即T的指针类型。
- 指针地址
指针变量的值是指针地址。指针地址带有"0x"的十六进制前缀。指针地址在64位平台上是64位内存地址,在32位平台上是32位地址。
- 指针(变量)取值
使用*
操作符,对指针变量取值,从指针变量中获取(指针地址指向的)原普通变量的值。
- 操作符
&
和*
取(内存)地址操作符&
和取(指针变量)值操作符*
是一对互补操作符:
1)使用&
取出普通变量的(内存)地址得到指针变量
2)使用*
对指针变量进行取值操作,获得指针指向的原普通变量值
3)*(*T)
取出指针变量指向的原普通变量值,即*(*T)
指向原来T类型的普通变量
2. 指针(变量):取指针地址(&)和指针类型(*T)
在程序运行时,每个变量都拥有一个(内存)地址,这个地址表示变量在内存中的位置。在go中,我们使用&
对变量进行取地址
操作。格式如下:
ptr := &ins