Golang指针的操作以及常用的指针函数

news2024/11/20 21:36:02

目录

指针的操作

定义指针

获取变量地址

解引用指针

指针作为函数参数

指针的空值

常用的指针函数

new 函数

make 函数

append 函数

copy 函数


指针的操作

在Go语言中,指针是一种非常重要的类型,可以用来传递变量的地址而不是变量本身。

定义指针

在Go语言中,使用*运算符来定义指针。例如,以下是定义一个整型指针的语法:

var ptr *int

获取变量地址

可以使用&运算符获取变量的地址,例如:

var a int = 10
var ptr *int = &a

在这个示例中,ptr变量包含了变量a的地址。

解引用指针

使用*运算符解引用指针,访问指针指向的变量。例如,以下是使用指针访问变量的示例:

var a int = 10
var ptr *int = &a

fmt.Println("a 的值为:", a)
fmt.Println("*ptr 的值为:", *ptr)

在这个示例中,*ptr将访问ptr所指向的变量,也就是a的值。

指针作为函数参数

在函数中可以使用指针作为参数,从而可以修改调用函数时传递的变量的值。例如:

func swap(x *int, y *int) {
    var temp int
    temp = *x    /* 保存 x 地址的值 */
    *x = *y      /* 将 y 赋值给 x */
    *y = temp    /* 将 temp 赋值给 y */
}

func main() {
    /* 定义局部变量 */
    var a int = 100
    var b int= 200

    fmt.Printf("交换前 a 的值 : %d\n", a )
    fmt.Printf("交换前 b 的值 : %d\n", b )

    /* 调用 swap() 函数
     * &a 指向 a 变量的地址
     * &b 指向 b 变量的地址
     */
    swap(&a, &b)

    fmt.Printf("交换后 a 的值 : %d\n", a )
    fmt.Printf("交换后 b 的值 : %d\n", b )
}

在这个示例中,swap()函数使用指针作为参数,从而可以修改main()函数中传递的变量ab的值。

指针的空值

在Go语言中,指针可以为空,例如:

var ptr *int = nil

在这个例子中,我们创建了一个指向int类型变量的指针p。我们将p初始化为nil,这表示它不指向任何有效的内存地址。然后,我们使用&运算符获取变量x的地址,并将其分配给指针p。最后,我们使用*运算符解除引用p,以获取存储在其指向的地址中的值,并将其存储在变量y中。

请注意,在Go语言中,指针不能进行算术运算,也不能与整数直接相加或相减。此外,在访问指针所指向的值之前,必须确保指针不是nil,否则会导致运行时错误。

常用的指针函数

在 Go 语言中,指针是一个非常重要的概念,可以用于在程序中操作内存,提高程序效率。除了基本的指针运算外,还有一些常用的指针函数可以用于操作指针。

new 函数

new 函数用于创建一个指向某个类型的指针,并返回该指针的地址。下面是一个示例:

func main() {
    var p *int
    p = new(int)
    *p = 10
    fmt.Println(*p)
}

这里使用 new 函数创建了一个 int 类型的指针,并将其赋值给变量 p。然后通过指针 p,对变量进行赋值和输出操作。

make 函数

make 函数用于创建一个类型为切片、映射或通道的对象,并返回该对象的引用。下面是一个示例:

func main() {
    var s []int
    s = make([]int, 5)
    s[0] = 1
    fmt.Println(s)
}

这里使用 make 函数创建了一个长度为 5 的整型切片,并将其赋值给变量 s。然后通过下标操作,对切片中的元素进行赋值和输出操作。

append 函数

append 函数用于向切片中添加元素。它可以接收一个或多个参数,每个参数都是要添加到切片中的元素。下面是一个示例:

func main() {
    var s []int
    s = append(s, 1)
    s = append(s, 2, 3, 4)
    fmt.Println(s)
}

这里首先创建了一个空的整型切片,并使用 append 函数添加了三个元素。最后输出了添加元素后的切片。

copy 函数

copy 函数用于将一个切片的内容复制到另一个切片中。它接收两个参数,第一个参数是要复制到的切片,第二个参数是要复制的切片。下面是一个示例:

func main() {
    s1 := []int{1, 2, 3}
    s2 := []int{4, 5, 6}
    copy(s1, s2)
    fmt.Println(s1)
}

这里创建了两个整型切片 s1 和 s2,并将 s2 的内容复制到 s1 中。最后输出了复制后的 s1。

除了以上常用的指针函数外,还有其他一些常用的指针操作,例如:取地址符 &、指针解引用符 *、指针运算符 + 和 - 等。在使用指针时,需要注意指针是否为空,以及指针是否指向有效的内存地址。同时,也需要注意指针的生命周期,以避免出现野指针等问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode刷题总结】——代码随想录(链表总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。 以下是个人刷题总结,官…

多个Node.js版本之间切换

本篇文章会讲windows和Mac系统下实现多个node.js版本之间的切换。 1.windows下采用nvm(nvm-window) 2.Mac下采用nvm和n 注:window和mac下的nvm地址是不一样的 一、windows系统 什么是nvm? nvm是一个简单的bash脚本&#xff…

真题详解(有限自动机)-软件设计(七十七)

确定有限自动机 和 不确定有限自动机 解析: M1的A当0的时候,会变成A,也可能变成B, 所以M1是不确定有限自动机。 M2的A1的时候只会使A,0的时候只会是B B的0只会是B,1的时候只会是C。 C0的时候只会是B&a…

中小型企业需要“数据防泄露”吗?

数据防泄露是指企业采取的各种管理、技术与监督措施,以防止敏感和关键数据在传输、存储与使用过程中被未经授权访问或窃取,从而导致机密性、完整性或可用性受到损害。 数据防泄露工作通常包括数据分类与风险评估、权限管理与访问控制、加密与安全技术、数…

基于Gabor-小波滤波深度图表面法线的特征提取算法【通过正常Gabor-小波的直方图进行2D或3D特征提取】研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Bean的生命周期揭秘:从诞生到消亡,一个对象的壮丽演绎!

大家好,我是你们的小米。今天我要给大家揭秘一下Java开发中重要的概念——Spring Bean的生命周期。作为Java开发者,无论是在面试还是实际工作中,了解Bean的生命周期都是必备的知识点。让我们一起来深入了解吧! 什么是Spring Bean …

【zabbix】PostgreSQL表信息查询收集监控

昨天开发那边给了一个需求,每隔一段时间查询一下数据库某表中的数据是否在最近更新,让我这边做一个监控信息收集 一、agent linux侧配置 这边目前就直接在zabbix上实现,首先就是脚本,我用python2实现 脚本名:check_y…

软件测试学什么——如何才能按时上线?

目录 引言 一、提前介入测试,认真做好需求分析。 二、测试计划没必要花太多精力。 三、测试用例编写 四、测试执行的关键点 五、测试环境 【一套系统提升学习的好资料】 阅读书籍文档 总结 引言 上线,永远是软件测试工程师最关注的问题。 上线…

Linux文件系统学习笔记

笔记 修改文件属性与权限数字修改文件权限符号修改文件权限 目录与文件的意义文件的权限目录的权限 路径 修改文件属性与权限 chgrp:修改用户组 chown:修改拥有者 chmod:修改用户权限 其中修改权限:chmod可以用数字修改或者符号修改 数字修改文件权限 一共有三种身份:拥有者…

freeswitch的2833和inband对接方案

概述 freeswitch支持三种模式的DTMF传输方式,分别时inband、INFO、2833。 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中,需要将DTMF码做格式转换,通常是2833和inband之间的转换。 …

《思考致富》制造借口是一个根深蒂固的习惯

目录 经典摘录 领导方式有两种 拖拉 决心:克服拖拉的坏习惯(通往致富之路的第七步) 毅力:催生信念的持久努力(通往致富之路的第八步) 智囊团的力量:致富驱动力(通往致富之路的第…

【分享】你用免费的GPT4了嘛?

哈喽,大家好,我是木易巷~ 现在OpenAI的ChatGPT4需要升级为plus会员使用,对于国内的用户来说,不仅需要魔法,还需要有一张外网的信用卡来开通会员,真的麻烦。 最近木易巷发现了一个项目,是GitHu…

基于欧式距离的聚类算法的Kmeans作业

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 基于欧式距离的聚类算法,其认为两个目标的距离越近,相似度越大。 该实验产生的点为二维空间中的点。 环境配置 java环境,使用原生的Java UI组件JPanel和JFrame 算法原理 基于欧式距离的聚…

问卷调查类型全面解析

调查问卷是从人们那里收集反馈和意见的强大工具。通过提出结构化问题,研究人员、组织和企业可以获得大量有关如何改进产品或服务、解决问题或做出明智决策的信息。但在设计调查问卷之前,必须首先了解不同的类型以及何时使用它们。 1、结构化问卷 结构化…

秀场、卖场、生态场,长沙为何连展会也与众不同?

文 | 智能相对论 作者 | 易不二 第三届长沙国际工程机械展览会已经完美落下帷幕。 依托长沙作为“工程机械之都”的硬核产业实力,又经过了多年耕耘,长沙国际工程机械展已经达到了跻身全球一流展会的水平。 4天的展期里,全球1502家企业参展…

【产品经理】产品体验报告准备

假如你已经决定为一个app写一份产品体验报告了,那么,我想说的是,不要急着动笔! 下面就进入正题,在写产品体验报告之前,我会先去做哪些准备工作: (1)下载、把玩并熟悉app…

15-03 软件安全

系统安全 系统安全威胁 病毒蠕虫特洛伊木马Rootkit后门僵尸网络零日攻击Webshell 操作系统防御 杀毒软件:兵来将挡,水来土掩升级补丁:防止零日攻击限制:用户、网络、端口、程序、安全基准、不可变基础架构 杀毒软件检测机制 …

【猿人学WEB题目专解】猿人学第18题

🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言: 🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~ ✨个…

财报解读 | 护肤业务乘风破浪,逸仙电商手握增长“王牌”

五年新战略计划进入第二年,逸仙电商能否如愿“一步、两步、三步”向前走? 5月16日,逸仙电商发布了2023年第一季度财报。财报显示,逸仙电商Q1实现营收8.91亿元,超出了此前指引上限;实现净利润5070万元&…

从0构建神经网络(1)从感知机到神经网络

一、前言 深度学习中有许多框架,包括Tensorflow、PyTorch、Keras等,框架中实现了各种网络,并且可以自动求导,因此构建一个完整的网络只需要十几行代码。因为框架高度封装,因此我们无法知道底层的原理。为了更好地理解…