go中的指针详解

ops/2024/11/13 9:19:01/

因为大一的时候c语言没学好,所以看到指针很心烦 ,后来速成了一遍go ,每每写道指针部分就开始遗忘 ,所以专门对指针部分做了此笔记

概念

在 Go 语言中,指针是一种变量类型,它存储的是另一个变量的内存地址。通过指针,你可以访问和修改它指向的内存位置上存储的数据。这和 Java 中的引用类型变量(如对象的引用)有相似之处,因为它们都允许通过一个“引用”或“指针”来操作实际的数据。

指针是一个变量 和int int32 float32 uint64一样都是变量 只是该变量存储的是数据是地址

代码观察

/**
指针是变量 地址是变量的内存地址 是数据
指针可以理解为一个变量类型,可以指向其他变量的内存地址,通过指针可以修改其他变量的值。
如果传递一个非引用对象(java中的对象 java的对象名其实就是类似于指针的概念) 如果传递的是数据的话那么方法修改了 也不是会影响到原来的数据的
如果传递的是引用对象(java中的对象 java的对象名其实就是类似于指针的概念) 那么方法修改了 也会影响到原来的数据的
*/

func pointdemo() {a, b := 1, 2.34fmt.Println("输出变量a和b的值:")fmt.Println("a=", a, "b=", b)//输出:输出变量a和b的值:a= 1 b= 2.34fmt.Println("输出对应的地址:")fmt.Printf("a的地址:%p\n", &a)fmt.Printf("b的地址:%p\n", &b)//输出:a的地址:0xc00000a0d8
//b的地址:0xc00000a0f0// 创建指针var pA *int = &apB := &b//是一样的 所以可以发现 指针的地址是一样的/* 所以大一我就认为地址和指针是一个东西 导致后面接口 还有方法的时候会出很多问题
a的地址:0xc00000a0d8
b的地址:0xc00000a0f0
*/fmt.Printf("a的地址:%p\n", pA)fmt.Printf("b的地址:%p\n", pB)
//由于指针也是存储地址的变量 那么作为变量肯定也有自己的地址fmt.Printf("指针在取地址a的地址:%p\n", &pA)fmt.Printf("指针b的地址:%p\n", &pB)/*指针在取地址a的地址:0xc000060028指针b的地址:0xc000060030*/// 通过指针输出数据fmt.Println("通过指针输出a的值:", *pA)fmt.Println("通过指针输出b的值:", *pB)// 修改指针指向的数据*pA = 3*pB = 4.56fmt.Println("修改后的a和b的值:")//使用指针获取数值  对指针获取数据fmt.Println("指针方式a=", *pA, "b=", *pB)//使用地址获取数值 对地址获取数据fmt.Println("地址方式取数=", *(&a), "b=", *(&b))
/*这里就验证了指针可以通过*指针获取数据并且改变地址也可也可以通过这个符号改变 
*/*(&a) = 5*pB = 6.78fmt.Println("指针改变数值后a和b的值=", a, "b=", b)
}

错误笔记

上面讲了和java的类似 那么这里记录我的一个小错误

	fmt.Println("请输入一个字符串:")var input stringscanln, err := fmt.Scanln(&input)fmt.Println(input)

既然可以通过传递地址然后输入的数值赋予变量 那么我传递指针也是一样的吧?

	var name *stringfmt.Println("请输入一个字符串:")fmt.Scanln(name)fmt.Println("输入的数据:", *name)fmt.Println("输入的读取的单位数 这里是行为:", scanln)

运行
在这里插入图片描述
无效的地址指针
这里我就突然忘记了
指针既然是变量 那么是需要初始化的 不初始化只是有一个地址 地址没有指向任何一个空间 所以无法把输入的值传递给他 所以指针线初始化指向一个变量的地址 这里scan赋值过程就变成了 用户输入值->指针地址->找到指针装载的值(地址)->通过地址找到这个变量的内存空间进行修改

demo := "初始化"var name *string = &demofmt.Println("请输入一个字符串:")fmt.Scanln(name)fmt.Println("输入的数据:", *name)

http://www.ppmy.cn/ops/46532.html

相关文章

字符串压缩

题目链接 字符串压缩 题目描述 注意点 字符串长度在[0, 50000]范围内若“压缩”后的字符串没有变短,则返回原先的字符串字符串中只包含小写英文字母(a至z) 解答思路 模拟思路,使用pre存储当前位置的前一个字符,使…

修改文档日期神器 - Python打造日期修改器

这篇文章将介绍一款使用 Python 开发的实用工具 - 日期修改器。它可以帮助您轻松修改 Word (.docx) 和 PDF 文档的日期信息,满足日常办公和文档整理的需求。 C:\pythoncode\new\modifyfiledate.py 软件功能 支持修改 Word (.docx) 日期信息。允许选择要修改的日期…

「架构」单元测试及运用

在参与管理和研发软件项目的过程中,单元测试的实际运用对于确保最终产品的质量至关重要。以下是一些实际运用的案例和说明。 静态测试的实际运用 在TechCorp的电子商务平台项目中,静态测试作为代码质量保证的第一道防线。开发团队在编写代码的同时,使用SonarQube等静态代码…

Rust struct

Rust struct 1.实例化需要初始化全部成员变量2.如果需要实例化对象可变,加上mut则所有成员变量均可变 Rust支持通过已实例化的对象,赋值给未赋值的对象的成员变量 #![allow(warnings)] use std::io; use std::error::Error; use std::boxed::Box; use s…

【杂项】几个快捷键提高你的办公效率(装13使用)

前言 其实在Windows下不同的IDE也支持在文本编辑的时候,让你不需要使用鼠标也能够快速的操作。下面以VSCODE为例子 从当前位置开始选中 shift 键盘下键多行插入 ctrl alt 鼠标下键 退出多行插入esc回到一行文字开头 Home 键,回到一行文字结尾 End。…

新浪测试社招要个25K,第一次面大厂挂了

一面 1、讲下被测系统和你负责测试的模块功能? 2、为什么选择这个测试框架,这个测试框架有什么优缺点? 3、测试文件的目录,包含哪些包,这些之间是怎么调用的? 4、UI自动化和接口自动化都是怎么做的&…

计算机组成原理期末复习

1、RISC与CISC的比较,那种指令集更快? RISC(精简指令集计算机)和CISC(复杂指令集计算机)是两种不同的计算机指令集架构,各有其优缺点。 RISC(精简指令集计算机): RISC指令集的设计理念是通过减少指令的数量和复杂度来提高处理器的执行效率。RISC指令通常在一个时钟周…

【操作与配置】VS2017与MFC环境配置

【操作与配置】VS2017与MFC环境配置 概述 Visual Studio 是一款强大且多功能的集成开发环境(IDE),适用于软件开发人员和团队。使用此应用程序,您可以构建和调试现代Web应用程序,并利用扩展帮助探索几乎任何编程语言。…