Go 语言–>指针

它允许你操作内存中的实际数据,而不仅仅是数据的副本。指针存储的是另一个变量的内存地址,而不是变量的实际值。

1. 什么是指针

指针是存储变量内存地址的变量,它指向另一个变量。通过指针,你可以间接地访问和修改那个变量的值。

  • 指针变量:指针存储一个内存地址,这个内存地址指向一个具体的值。
  • 解引用:通过指针访问指向的变量的值。

2. 声明指针

在 Go 中,指针通过在类型前加上 * 来声明。例如,*int 表示一个指向 int 类型的指针。

示例:声明指针

var ptr *int  // ptr 是一个指向 int 类型的指针

3. 获取指针(取地址)

使用 & 操作符可以获得一个变量的内存地址,这叫做取地址。

示例:获取指针

package mainimport "fmt"func main() {var a int = 58var ptr *int = &a  // ptr 保存 a 的地址fmt.Println("a 的值:", a)       // 输出:a 的值: 58fmt.Println("ptr 的值:", ptr)   // 输出:ptr 的值: &afmt.Println("ptr 指向的值:", *ptr)  // 输出:ptr 指向的值: 58
}
  • &a:返回变量 a 的内存地址。
  • *ptr:返回指针 ptr 所指向的变量的值。

4. 通过指针修改变量值

通过指针可以间接修改变量的值。通过解引用(*ptr)可以修改指针所指向的变量的值。

示例:通过指针修改值

package mainimport "fmt"func main() {var a int = 58var ptr *int = &a  // ptr 指向 a 的地址fmt.Println("修改前 a 的值:", a)  // 输出:修改前 a 的值: 58*ptr = 100  // 通过指针修改 a 的值fmt.Println("修改后 a 的值:", a)  // 输出:修改后 a 的值: 100
}

5. 指针与函数传参

Go 中的函数传参是按传递的,这意味着函数内部的参数是传入值的副本。如果你想要在函数内修改参数的值,必须通过指针传递

示例:通过指针修改函数参数的值

package mainimport "fmt"func modifyValue(ptr *int) {*ptr = 500  // 修改 ptr 指向的变量的值
}func main() {a := 100fmt.Println("修改前 a 的值:", a)  // 输出:修改前 a 的值: 100modifyValue(&a)  // 将 a 的地址传递给函数fmt.Println("修改后 a 的值:", a)  // 输出:修改后 a 的值: 500
}

6. 零值指针

Go 中的指针默认值是 nil,即如果一个指针没有指向任何地址,它的默认值是 nil。你可以检查指针是否为 nil 来判断它是否已经被初始化。

示例:零值指针

package mainimport "fmt"func main() {var ptr *int  // 默认为 nilfmt.Println("ptr 的值:", ptr)  // 输出:ptr 的值: <nil>if ptr == nil {fmt.Println("指针是 nil")}
}

7. 指针和数组、切片

Go 中的数组和切片也可以通过指针来传递,指针可以用来操作数组或切片的数据。

示例:指针与数组

package mainimport "fmt"func modifyArray(arr *[3]int) {arr[0] = 100  // 通过指针修改数组
}func main() {arr := [3]int{1, 2, 3}fmt.Println("修改前数组:", arr)  // 输出:修改前数组: [1 2 3]modifyArray(&arr)  // 将数组的地址传递给函数fmt.Println("修改后数组:", arr)  // 输出:修改后数组: [100 2 3]
}

8. 指针与结构体

指针也可以指向结构体,结构体指针可以通过 -> 语法来访问结构体的字段,或者通过 * 解引用来访问结构体字段。

示例:指针与结构体

package mainimport "fmt"type Person struct {Name stringAge  int
}func modifyPerson(p *Person) {p.Name = "Alice"p.Age = 30
}func main() {person := Person{Name: "Bob", Age: 25}fmt.Println("修改前:", person)  // 输出:修改前: {Bob 25}modifyPerson(&person)  // 将结构体的地址传递给函数fmt.Println("修改后:", person)  // 输出:修改后: {Alice 30}
}

9. 指针的高级应用:指针的指针

Go 支持指针的指针,即你可以有一个指向指针的指针。这通常用于函数传递多个级别的地址或动态创建多级引用。

示例:指针的指针

package mainimport "fmt"func main() {var a int = 58var ptr *int = &avar ptr2 **int = &ptr  // ptr2 是指向 ptr 的指针fmt.Println("a 的值:", a)       // 输出:a 的值: 58fmt.Println("ptr 的值:", *ptr)  // 输出:ptr 的值: 58fmt.Println("ptr2 指向的值:", **ptr2) // 输出:ptr2 指向的值: 58
}

10. 总结

  • 指针允许你通过内存地址间接访问和修改变量的值。
  • 取地址操作符 (&) 用于获取变量的内存地址。
  • 解引用操作符 (*) 用于访问指针指向的变量的值。
  • Go 中的 指针默认值为 nil,检查指针是否为 nil 是一个好的编程习惯。
  • Go 中的 指针可以与数组、切片、结构体 等一起使用,可以高效地传递大数据结构而无需复制数据。

指针在 Go 中的使用使得函数能直接修改外部变量,而不需要返回修改后的副本,这在处理大数据结构或需要高效内存管理时非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/93292.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93292.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93292.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软工八将:软件开发全流程核心角色体系解析

软工八将&#xff1a;软件开发全流程核心角色体系解析 作者注&#xff1a;本概念是由大学生董翔提出&#xff0c;具有一些影响意义。 在现代软件开发领域&#xff0c;团队角色的专业化分工是产品成功的核心保障。“软工八将”作为一套系统梳理软件开发全流程核心角色的术语&…

安全风险监测系统是什么?内容有哪些?

安全风险监测系统是基于物联网感知网络与智能分析技术的综合管理平台&#xff0c;通过实时采集、分析和评估各类安全风险指标&#xff0c;构建起覆盖识别、预警、处置全流程的主动防御体系。作为现代安全管理的中枢神经系统&#xff0c;该系统实现了从被动响应到主动预防的范式…

车载诊断架构 ---面向售后的DTC应该怎么样填写?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

墨者:SQL注入漏洞测试(宽字节)

墨者学院&#xff1a;SQL注入漏洞测试(宽字节)&#x1f680; 1. 宽字节注入原理✨ 1.1. 与普通注入对比⭐ 特性普通注入宽字节注入适用场景无转义处理使用addslashes()等转义函数核心原理直接闭合引号利用GBK等编码吞掉转义符\关键字符 " -- #%df %5c防御难度易防御需调…

(二)Eshop(RabbitMQ手动)

文章目录项目地址一、Rabbit MQ1.1 Pulibsher1. IRabbitMQPublisher接口2. RabbitMQPublisher接口实现3. 使用1.2 Consumer1. 消费接口2. 实现消费者接口项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt a…

WPF高级学习(一)

文章目录一、理解进程和线程1. 进程&#xff1a;就像一个独立的“工厂”举例&#xff1a;2. 线程&#xff1a;就像工厂里的“工人”举例&#xff1a;总结&#xff1a;进程 vs 线程二、线程一、WPF 中的线程类型二、核心规则&#xff1a;线程亲和性&#xff08;Thread Affinity&…

JAVA知识点(四):SpringBoot与分布式、微服务架构

文章目录SpringBoot 使用 Validation 进行参数校验并统一返回校验异常引入相应的依赖Validation的基本校验注解添加参数校验在DTO的属性上添加校验在controller对应的DTO添加Valid或者Validated对于复杂String校验我们可以使用正则来校验&#xff0c;如下所示&#xff1a;自定义…

GPU 服务器ecc报错处理

1. 常见原因分析内存硬件问题&#xff1a;DIMM 内存模块损坏或接触不良&#xff08;最常见原因&#xff09;。内存插槽氧化、松动或物理损坏。内存与主板兼容性问题&#xff08;尤其是非原厂内存&#xff09;。环境因素&#xff1a;服务器内部温度过高&#xff0c;导致内存稳定…

STM32入门之通用定时器PWM

一、通用定时器简介STM32通用定时器由一个通过可编程预分频器驱动的16位自动重装载计数器组成&#xff0c;适用于多种应用场景&#xff0c;包括测量输入信号的脉冲长度&#xff08;利用输入捕获功能&#xff09;和生成输出波形&#xff08;使用输出比较及PWM功能&#xff09;。…

第十八节 MATLAB for循环

MATLAB中 for 循环是一个重复的控制结构&#xff0c;可以有效地写一个循环&#xff0c;只是执行的次数是特定的。MATLAB for 循环语法:MATLAB中的 for循环的语法如下&#xff1a;for index values<program statements>... endfor 循环的值有下述三种形式之一&#xff1a…

嵌入式硬件篇---zigbee无线串口通信问题解决方法

针对 ZigBee 无线串口通信中接收异常的问题&#xff0c;需结合其射频特性、网络机制、硬件配置等多维度原因&#xff0c;采取针对性解决措施。以下从具体场景出发&#xff0c;提供可落地的解决方法&#xff1a;一、解决射频层干扰与信号衰减问题射频层是无线通信的基础&#xf…

移动高清盒子6PRO-河南创维E900V22D-晶晨S905L3B-4+16G-安卓9-线刷固件包

移动高清盒子6PRO-河南创维E900V22D-晶晨S905L3B-416G-安卓9-线刷固件包线刷方法&#xff1a;1、准备好一根双公头USB线刷刷机线&#xff0c;长度30-50CM长度最佳&#xff0c;同时准备一台电脑&#xff1b;2、电脑上安装好刷机工具Amlogic USB Burning Tool 软件 →打开软件 →…

台式电脑有多个风扇开机只有部分转动的原因

一、风扇未连接或连接松动这是最常见的原因之一&#xff0c;台式机风扇通常需要通过线材与主板或电源连接&#xff1a;主板接口问题&#xff1a;CPU 风扇、机箱风扇等多连接到主板的风扇接口&#xff08;如 CPU_FAN、SYS_FAN&#xff09;&#xff0c;若线材未插紧、插错接口&am…

【测试报告】思绪网(Java+Selenium+Jmeter自动化测试)

一、项目简介思绪网作为一种在线交流平台&#xff0c;支持用户在平台下发布文章&#xff0c;并进行讨论。主要由登录页面&#xff0c;论坛页面&#xff0c;帖子编辑页&#xff0c;帖子详情页等页面组成。二、项目功能1.登录页面&#xff1a;输入正确的账号密码进行登录,跳转博客…

Nestjs框架: 基于Mongodb的多租户功能集成和优化

概述 基于前文&#xff0c;我们知道如何集成多租户的相关功能了, 现在我们继续集成Monodb的多租户形式需要注意的是&#xff0c;MongoDB 在 NestJS 中的使用过程中存在一些“坑点”如果按照默认方式集成&#xff0c;会发现连接数在不断增长&#xff0c;即使我们请求的是相同的数…

如何利用机器学习分析筛选生物标记物

在生物信息学中&#xff0c;Lasso回归、随机森林&#xff08;Random Forest&#xff09;和XGBoost因其各自的特性和优势&#xff0c;被广泛应用于基因组学、蛋白质组学、药物发现和疾病机制研究等领域。 Lasso回归 癌症亚型分类&#xff1a;从TCGA数据中筛选驱动基因&#xf…

计算机网络(基础篇)

TCP/IP 网络模型 应用层&#xff08;Application Layer&#xff09; 应用层只需要专注于为用户提供应用功能&#xff0c;比如 HTTP、FTP、Telnet、DNS、SMTP等。应用层是工作在操作系统中的用户态&#xff0c;传输层及以下则工作在内核态。传输层&#xff08;Transport Layer&a…

全面解析 CSS Flex 布局:从入门到精通的所有属性详解

1. Flex 容器属性 通过 display: flex 或 display: inline-flex 将元素设置为 Flex 容器。以下是所有容器属性。 1.1 display: flex | inline-flex 作用&#xff1a;定义一个 Flex 容器。可选值&#xff1a; flex&#xff1a;块级容器&#xff0c;占据整行。inline-flex&#x…

数据结构:对角矩阵(Diagonal Matrix)

目录 矩阵的传统表示&#xff1a;二维数组 &#x1f50d; 真正有用的数据是哪些&#xff1f; 从二维数组转为一维数组 用 C 类实现对角矩阵 1. 对角矩阵真正需要存什么&#xff1f; 2. 对角矩阵允许哪些行为&#xff1f; 3. 为什么要动态分配数组&#xff1f; 接下来推…

Leetcode_349.两个数组的交集

这道题的意思很明确&#xff0c;就是让寻找两个数组中的共同元素&#xff0c;并去重&#xff0c;由此可以联想到哈希表的特性&#xff0c;注意到题目给的数据范围&#xff0c;在1000以内&#xff0c;所以本题可以使用 STL 的库函数&#xff0c;也可以使用数组进行模拟。 本题要…