Go 1.4操作符指针理解

ops/2025/2/14 5:25:19/

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

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

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

指针==指向的内存地址

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

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

场景:

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

package mainimport "fmt"func main() {x := 10p := &x // p 是指向 x 的指针fmt.Println("x 的值:", x)fmt.Println("p 保存的地址:", p)fmt.Println("通过 p 访问 x 的值:", *p)
}

2. 指针的特点

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

3. * p操作符

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

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

package mainimport "fmt"func main() {var x int = 10   // 声明一个变量 x,值为 10var p *int       // 声明一个指向 int 类型的指针 pp = &x           // 使用取地址符 & 获取 x 的内存地址,并赋值给 pfmt.Println("x 的值:", x)          // 输出 x 的值,10fmt.Println("p 存储的地址:", p)    // 输出 p 存储的地址fmt.Println("通过 p 获取的值:", *p) // 通过指针 p 获取指向的值(即 x 的值)// 通过指针修改 x 的值*p = 20fmt.Println("修改后的 x 的值:", x) // 输出修改后的 x 的值,20
}
  • &x 表示取变量 x 的内存地址,将该地址赋给 p
  • *p 表示通过指针 p 来访问它指向的变量的值。在这里,*p 的值就是 x 的值。
  • *p = 20 表示通过指针修改 x 的值。

package mainimport "fmt"type Person struct {Name stringAge  int
}func main() {var p *Person  // 声明一个指向 Person 类型的指针 p, 初始值为 nilfmt.Println(p)  // 打印 p,结果是 nil// 创建一个 Person 类型的变量p1 := Person{Name: "John", Age: 30}// 获取 p1 的内存地址,并赋值给指针 pp = &p1fmt.Println(p)    // 打印 p,结果是 p1 的内存地址fmt.Println(*p)   // 解引用指针 p,打印 p1 的值
}

4.疑惑

4.1、指针类型
package mainimport "fmt"type Person struct {Name stringAge  int
}func main() {p1 := Person{"John", 30}  // 创建一个 Person 类型的变量 p1var p *Person              // 声明一个指向 Person 类型的指针 pp = &p1                     // 将 p1 的内存地址赋给 p,即 p 指向 p1fmt.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.ppmy.cn/ops/158221.html

相关文章

vscode关闭后如何恢复在远程服务器的终端程序运行界面

网上有很多种解决方案,我觉得比较好用的是screen。这里先介绍screen的安装和使用办法: 通过 conda 安装 screen是比较方便的方式,可以按照以下步骤操作: 通过 Conda 安装 screen 打开终端或命令行工具。确保你已经激活了 Conda 环…

防火墙是什么?详解网络安全的关键守护者

当今信息化时代,企业和个人在享受数字生活带来的便利时,也不可避免地面对各种潜在的风险。防火墙作为网络安全体系中的核心组件,就像一道牢不可破的防线,保护着我们的数据和隐私不受外界威胁的侵害。那么防火墙是什么?…

Vite入门指南

一、什么是Vite? Vite(法语意为"快速")是由Vue作者尤雨溪开发的新型前端构建工具。它基于原生ES模块(ESM)实现,具有以下核心优势: 极速启动:冷启动时间比Webpack快10-10…

机器学习数学基础:22.对称矩阵的对角化

一、核心概念详解 (一)内积 定义与公式:在 n n n维向量空间中,对于向量 x ⃗ ( x 1 , x 2 , ⋯ , x n ) \vec{x}\ (x_1,x_2,\cdots,x_n) x (x1​,x2​,⋯,xn​)和 y ⃗ ( y 1 , y 2 , ⋯ , y n ) \vec{y}\ (y_1,y_2,\cdots,y_…

DeepSeek学习笔记之——DeepSeek-R1论文(英中对照)

《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning》 (用的google翻译,凑和能看~~~,共22页,第17页起为贡献&致谢) P1: P2: P3: P4: P5: P6: P7: P8: P9: P10: P11: P12: P13: P14: P15: P16: P17…

用户体验UP!响应式网页设计的CSS魔法

响应式设计需要结合多种技术手段,核心在于: 内容流动性的保持设备特性的适配性能优化的平衡渐进增强的策略 一、核心响应式技术 1. 媒体查询(Media Queries) 视口分段管理: /* 移动端优先(默认样式&am…

代码实践——准备阶段

使用Windows11进行部署项目,使用anaconda、git bash和pycharm部署,全面配置环境磕磕绊绊,虽然最后都通过gpt老师解决了,在运行wenet代码到第四步的时候,deepspeed库怎么都安装不上,查阅很多资料发现&#x…

数智百问 | 制造企业如何降低产线检测数据的存储和管理成本?

在《“十四五”智能制造发展规划》等政策的推动下,以及新能源汽车、消费电子等品牌商对产品质量和供应商智能化水平要求的提升,半导体、电子制造、动力电池等先进制造行业企业纷纷推进产线智能化升级,并投入大量机器视觉检测设备以实现自动化…