您的位置 首页 java

Go学习(八):指针

1.什么是指针?

指针是存储另一个变量的内存地址的变量。变量是一种使用方便的占位符,变量都指向计算机的内存地址。一个指针变量可以指向任何一个值的内存地址。

例如:变量a的值为100,存储在内存地址 0x1040a124 。变量b持有a的地址,则b被认为指向a。如下图

在Go语言中使用取地址符 (&) 来获取变量的地址,一个变量前使用 ,会返回该变量的内存地址。如下程序获取变量a的内存地址

 package main

import "fmt"

func main() {
 a := 1
 fmt.Printf("指针地址: %p",&a)
}
// 输出: 指针地址: 0xc00001c080  

2. 声明指针

2.1 语法

 var 指针变量名 *指针类型  

使用示例

 package main

import "fmt"

func main() {
 // 声明一个变量
 a := 100
 fmt.Printf("变量a--> 类型: %T, 值: %v 内存地址: %p n",a,a,&a)
 // 声明一个指向整型的指针变量
 var p *int
 // 取出变量a的内存地址,赋值给指针变量p
 p = &a
 fmt.Printf("指针变量p--> 类型: %T, 值: %v 指针指向的值:%v n",p,p,*p)
 // 通过指针变量修改变量a的值
 *p = 50
 fmt.Printf("通过指针变量p修改变量a的值--> 类型: %T, 值: %v 内存地址: %p n",a,a,&a)
}
/** 输出:
变量a--> 类型: int, 值: 100 内存地址: 0xc00001c080 
指针变量p--> 类型: *int, 值: 0xc00001c080 指针指向的值:100 
通过指针变量p修改变量a的值--> 类型: int, 值: 50 内存地址: 0xc00001c080 
*/  

2.2 指针地址和指针类型

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用 & 操作符放在变量前面对变量进行 取地址 操作。

格式如下:

 ptr := &v  
  • v : 代表被取地址的变量。
  • ptr : 储存变量 v 的内存地址, 它的类型为 *T ,被称为T的指针类型。 * 代表指针

3.空指针

在Go语言中,当一个指针被定义后没有分配到任何变量时,它的值为 nil nil指针也称为空指针 。nil在概念上和其他语言的 null、None、NULL 一样,都指代零值或空值。

3.1 空指针判断

 if (ptr != nil) // ptr不是空指针
if (ptr == nil) // ptr是空指针  

4.使用指针

4.1 使用指针修改变量的值

 package main

import "fmt"

func main() {
 // 声明一个变量
 a := 100
 fmt.Printf("变量a--> 类型: %T, 值: %v 内存地址: %p n",a,a,&a)
 // 声明一个指向变量a的指针变量
 var p = &a
 // 通过指针变量修改变量a的值
 *p = 50
 fmt.Printf("通过指针变量p修改变量a的值--> 类型: %T, 值: %v 内存地址: %p n",a,a,&a)
}
/**输出:
变量a--> 类型: int, 值: 100 内存地址: 0xc00001c080 
通过指针变量p修改变量a的值--> 类型: int, 值: 50 内存地址: 0xc00001c080 
*/  

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 ++
}
/**输出
变量a--> 类型: int, 值: 100 内存地址: 0xc0000b6008 
调用函数后,a的值--> 类型: int, 值: 101 内存地址: 0xc0000b6008 
*/  

5.指针数组

5.1 概念

指针数组: 就是元素为指针类型的数组。

定义指针数组:

 var ptr [n]*T  

5.2 使用

 package main
import "fmt"

func main() {
 // 声明一个数组
 arr := [3]string{"PHP","GO"," JAVA "}
 fmt.Printf("arr类型: %T arr类型值: %v n",arr,arr)
 // 声明一个指针数组 ptrArr
 var ptrArr [3]*string
 // 将数组中每个元素地址存到指针数组中:ptrArr
 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)
}
/**输出
arr类型: [3]string arr类型值: [PHP GO JAVA] 
ptrArr类型: [3]*string ptrArr类型值: [0xc000090180 0xc000090190 0xc0000901a0] 
修改后: arr类型: [3]string arr类型值: [PHP-v GO-v JAVA-v] 
*/  

6.指针的指针

6.1 概念

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。 当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址,如下图所示:

Go学习(八):指针

6.2 使用

 package main
import "fmt"

func main() {
// 声明一个指向整型int的指针变量
var ptr *int
// 声明一个指向整型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)
}
/* 输出:
ptr 类型: *int 值:10 
ptrr 类型: **int 值:10
*/  

微信搜索【猿码记】,获取实时信息。

文章来源:智云一二三科技

文章标题:Go学习(八):指针

文章地址:https://www.zhihuclub.com/191079.shtml

关于作者: 智云科技

热门文章

网站地图