当前位置: 首页 > article >正文

Go 1.4操作符指针理解

对于初学者来说操作符指针类型、指针、取地址容易混淆,多练就好了。

只需要记住两个符号:&(取内存地址)和*(解引用)。

定义和使用:你可以使用 & 操作符获取一个变量的内存地址,使用 * 操作符通过指针来访问该地址指向的变量值。

指针==指向的内存地址

1. & 取地址符(操作符)

& 是取地址符号,它用于获取一个变量的内存地址,也就是获取一个指向该变量的指针。

场景:

当你需要将某个变量的指针传递给另一个函数或在程序中需要引用该变量而不是复制它的值时,使用 &

package main

import "fmt"

func main() {
    x := 10
    p := &x // p 是指向 x 的指针

    fmt.Println("x 的值:", x)
    fmt.Println("p 保存的地址:", p)
    fmt.Println("通过 p 访问 x 的值:", *p)
}

2. 指针的特点

  • 可以存储某个变量的内存地址。
  • 可以通过指针修改变量的值。
  • 指针可以是 nil,即它不指向任何变量。

3. * p操作符

* 是解引用符号,用于通过指针访问指向的变量的值。它可以用来获取指针指向的内存地址处存储的数据。

当有一个指针,想要访问或修改指针指向的变量的值时,使用 *

package main

import "fmt"

func main() {
    var x int = 10   // 声明一个变量 x,值为 10
    var p *int       // 声明一个指向 int 类型的指针 p

    p = &x           // 使用取地址符 & 获取 x 的内存地址,并赋值给 p

    fmt.Println("x 的值:", x)          // 输出 x 的值,10
    fmt.Println("p 存储的地址:", p)    // 输出 p 存储的地址
    fmt.Println("通过 p 获取的值:", *p) // 通过指针 p 获取指向的值(即 x 的值)

    // 通过指针修改 x 的值
    *p = 20
    fmt.Println("修改后的 x 的值:", x) // 输出修改后的 x 的值,20
}
  • &x 表示取变量 x 的内存地址,将该地址赋给 p
  • *p 表示通过指针 p 来访问它指向的变量的值。在这里,*p 的值就是 x 的值。
  • *p = 20 表示通过指针修改 x 的值。

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    var p *Person  // 声明一个指向 Person 类型的指针 p, 初始值为 nil
    fmt.Println(p)  // 打印 p,结果是 nil

    // 创建一个 Person 类型的变量
    p1 := Person{Name: "John", Age: 30}
    
    // 获取 p1 的内存地址,并赋值给指针 p
    p = &p1
    fmt.Println(p)    // 打印 p,结果是 p1 的内存地址
    fmt.Println(*p)   // 解引用指针 p,打印 p1 的值
}

4.疑惑

4.1、指针类型
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := Person{"John", 30}  // 创建一个 Person 类型的变量 p1
    var p *Person              // 声明一个指向 Person 类型的指针 p
    p = &p1                     // 将 p1 的内存地址赋给 p,即 p 指向 p1

    fmt.Println(p)              // 输出指针 p,显示的是 p1 的内存地址
    fmt.Println(*p)             // 通过 *p 解引用指针,访问 p1 的内容
    fmt.Println(p.Name)         // 直接访问指针 p 所指向的结构体字段 Name
}

简单来说:

Person 是一个数据类型(比如一个结构体)。

  • *Person 是一个指针类型,它指向的是 Person 类型的变量。
  • p *Person 声明的是一个指针变量 p,它保存的是一个指向 Person 类型数据的内存地址。

解释:

1. p *Person:p 是一个指向 Person 类型的指针变量,意味着 p 保存的就是 Person 类型变量的内存地址。

2. p = &p1:我们将 p1 的内存地址赋给 p,也就是让 p 指向 p1。

3. *p:通过解引用 *p,我们可以访问指针 p 所指向的 Person 结构体的值。

4. p.Name:直接通过指针 p 访问 p1 的 Name 字段。


 

总结:

• p *Person 声明了一个指向 Person 类型的指针变量 p。

• p 保存的是 Person 类型变量的内存地址,*p 允许你通过指针访问和操作该变量的值。

如果还感到混乱,可以把指针理解成指向内存中某个位置的 “导航”。通过 & 获取指针,即获取 “导航”;通过 * 访问指针指向的实际数据,就是 “跟随导航去查看位置”。


http://www.kler.cn/a/542749.html

相关文章:

  • AWTK fscript 中的 TCP/UDP 客户端扩展函数
  • 题解 洛谷 Luogu P1828 [USACO3.2] 香甜的黄油 Sweet Butter 最短路 堆优化Dijkstra Floyd C++
  • 高等代数笔记—线性变换
  • k8s证书过期怎么更新?
  • 可编程网卡芯片在京东云网络的应用实践【BGW边界网关篇】
  • 第六篇:数字逻辑的“矩阵革命”——域控制器中的组合电路设计
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十二)-航班时间、日志统计、献给阿尔吉侬的花束
  • NLP面试-Transformer
  • 【后端发展路径】基础技术栈、工程能力进阶、高阶方向、职业发展路径
  • vue3自定义loading加载动画指令
  • Java集合List详解(带脑图)
  • 基于微信小程序的刷题系统的设计与实现springboot+论文源码调试讲解
  • 开发中用到的设计模式
  • Excel 笔记
  • 【哇! C++】第一个C++语言程序
  • docker compose部署dragonfly
  • 《pytorch》——优化器的解析和使用
  • 【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
  • Goland的context原理(存在问题,之前根本没有了解,需要更加深入了解)
  • 前端首屏时间优化方案
  • Python实现机器学习舆情分析项目的经验分享
  • Centos10 Stream 基础配置
  • 数据结构 双链表的模拟实现
  • 【前端】【面试】ref与reactive的区别
  • C# OpenCV机器视觉:模仿Halcon各向异性扩散滤波
  • 利用Ollama本地部署 DeepSeek