1.什么是指针?
指针是存储另一个变量的内存地址的变量。变量是一种使用方便的占位符,变量都指向计算机的内存地址。一个指针变量可以指向任何一个值的内存地址。
例如:变量a的值为100,存储在内存地址0x1040a124
。变量b持有a的地址,则b被认为指向a。如下图
在Go语言中使用取地址符(&)
来获取变量的地址,一个变量前使用&
,会返回该变量的内存地址。如下程序获取变量a的内存地址
package main
import "fmt"
func main() { a := 1 fmt.Printf("指针地址: %p",&a) }
|
Go
语言指针的最大特点是:指针不能运算。
2. 声明指针
2.1 语法
使用示例
package main
import "fmt"
func main() { a := 100 fmt.Printf("变量a--> 类型: %T, 值: %v 内存地址: %p \n",a,a,&a) var p *int p = &a fmt.Printf("指针变量p--> 类型: %T, 值: %v 指针指向的值:%v \n",p,p,*p) *p = 50 fmt.Printf("通过指针变量p修改变量a的值--> 类型: %T, 值: %v 内存地址: %p \n",a,a,&a) }
|
2.2 指针地址和指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&
操作符放在变量前面对变量进行取地址
操作。
格式如下:
v
: 代表被取地址的变量。
ptr
: 储存变量v
的内存地址,它的类型为*T
,被称为T的指针类型。*
代表指针
3.空指针
在Go语言中,当一个指针被定义后没有分配到任何变量时,它的值为nil
。nil指针也称为空指针
。nil在概念上和其他语言的null、None、NULL
一样,都指代零值或空值。
3.1 空指针判断
if (ptr != nil) if (ptr == nil)
|
4.使用指针
4.1 使用指针修改变量的值
package main
import "fmt"
func main() { a := 100 fmt.Printf("变量a--> 类型: %T, 值: %v 内存地址: %p \n",a,a,&a) var p = &a *p = 50 fmt.Printf("通过指针变量p修改变量a的值--> 类型: %T, 值: %v 内存地址: %p \n",a,a,&a) }
|
4.2 使用指针作为函数的参数
package main
import "fmt"
func main() { a := 100 fmt.Printf("变量a--> 类型: %T, 值: %v 内存地址: %p \n",a,a,&a) usePointParam(&a) fmt.Printf("调用函数后,a的值--> 类型: %T, 值: %v 内存地址: %p \n",a,a,&a) }
func usePointParam(val *int) { *val ++ }
|
5.指针数组
5.1 概念
指针数组: 就是元素为指针类型的数组。
定义指针数组:
5.2 使用
package main import "fmt"
func main() { arr := [3]string{"PHP","GO","JAVA"} fmt.Printf("arr类型: %T arr类型值: %v \n",arr,arr) var ptrArr [3]*string for i :=0; i<3; i++ { ptrArr[i] = &arr[i] } fmt.Printf("ptrArr类型: %T ptrArr类型值: %v \n",ptrArr,ptrArr)
for i :=0; i<3; i++ { a := ptrArr[i] *a += "-v" ptrArr[i] = a } fmt.Printf("修改后: arr类型: %T arr类型值: %v \n",arr,arr) }
|
6.指针的指针
6.1 概念
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址,如下图所示:
6.2 使用
package main import "fmt"
func main() { var ptr *int var ptrr **int a := 10 ptr = &a ptrr = &ptr fmt.Printf("ptr 类型: %T 值:%v \n",ptr,*ptr) fmt.Printf("ptrr 类型: %T 值:%v",ptrr,**ptrr) }
|