go 指针

作者: 呦丶耍脾气 | 来源:发表于2023-03-07 20:59 被阅读0次

1.什么是指针?

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

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

image.png

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

package main

import "fmt"

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

Go语言指针的最大特点是:指针不能运算。

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语言中,当一个指针被定义后没有分配到任何变量时,它的值为nilnil指针也称为空指针。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 概念

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

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
*/

相关文章

  • 关于golang指针的理解与使用

    Go指针理解 Go 有指针,但是没有指针运算。你不能用指针变量遍历字符串的各个字节。在 Go 中调用函数的时候,得...

  • 特殊数据类型

    指针 GO 语言像 C 一样有指针,可以通过指针访问数据,但是 GO 的指针要安全的多: 首先,访问空指针会直接报...

  • protoc-生成go指针

    protoc-生成go指针 这里指的是为结构体中基础类型生成go指针,嵌套结构体默认就是指针 为什么需要生成指针?...

  • go语言值传递与指针传递

    go语言指针 go语言作为静态编译型语言,具有指针类型,但是不提供对指针的移位危险操作,防止指针的越界等问题。 g...

  • Go教程第十篇:指针

    指针 在这篇教程中,我们将学习Go里面的指针是如何工作的,以及Go的指针和C/C++的区别和差异。 什么是指针 ?...

  • Golang 指针

    指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。Go语言当中的指针涉及到三个点:指...

  • Go语言 指针

    指针 概念 Go语言的指针和C语言一样也是用来保存地址的变量 格式 普通指针 指向数组的指针 注意点 GO语言中只...

  • go语言指针类型的使用

    go语言的指针类型 简单地说go语言的指针类型和C/C++的指针类型用法是一样的,除了出去安全性的考虑,go语言增...

  • 13-Go语言指针和方法

    指针 普通数据类型指针 Go语言中的普通指针和C语言中的普通指针一样, 通过指针也可以间接操作指向的存储空间 Go...

  • Golang学习笔记4——控制语句

    1.基础知识补充(指针、递增递减语句) 指针go虽然保留了指针,但是与其它编程语言不同的是,在go当中不支持指针运...

网友评论

      本文标题:go 指针

      本文链接:https://www.haomeiwen.com/subject/skyeldtx.html