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

Go基础(④指针)

简单示例

package mainimport "fmt"func main() {var num int = 100var p *int = &num // 指向int类型的指针fmt.Println(*p)   // 解引用,输出 100*p = 200          // 通过指针修改原变量fmt.Println(num)  // 输出 200
}

package mainimport "fmt"func main() {a := 10var p *int  // 声明一个指向int的指针pp = &a      // p存储a的内存地址(p指向a)fmt.Println("a的值:", a)      // 输出:a的值:10fmt.Println("a的地址:", &a)   // 输出:a的地址:0xc00001a0a8(地址值可能不同)fmt.Println("p存储的地址:", p) // 输出:p存储的地址:0xc00001a0a8(和a的地址相同)fmt.Println("p指向的值:", *p)  // 输出:p指向的值:10(通过指针访问a的值)// 通过指针修改a的值*p = 20fmt.Println("修改后a的值:", a)  // 输出:修改后a的值:20
}

函数中使用指针

如果想在函数内部修改外部变量的值,需要传递指针:

package mainimport "fmt"// 传递指针参数
func addOne(p *int) {*p = *p + 1  // 修改指针指向的变量的值
}func main() {x := 5addOne(&x)   // 传递x的地址fmt.Println(x)  // 输出:6(x的值被函数内部修改了)
}

数组指针的基本用法

数组指针

可以直接通过指针修改数组元素(Go 会自动解引用),但无法改变数组的长度(数组长度固定)。

package mainimport "fmt"func main() {// 定义一个数组arr := [3]int{10, 20, 30}// 声明一个数组指针,指向arrvar p *[3]int = &arr// 打印指针存储的地址(数组的地址)fmt.Println("数组地址:", p)  // 类似 0xc00001a0c0// 通过指针访问数组元素(两种方式都可以)fmt.Println(p[0])   // 直接用指针[索引],输出 10fmt.Println((*p)[1])// 先解引用再访问,输出 20(和上面效果一样)// 通过指针修改数组元素p[2] = 300fmt.Println(arr[2]) // 输出 300,原数组被修改了
}

    切片指针

    需先解引用指针才能操作切片元素,且可以修改切片的长度、容量或底层数组(通过 append 等操作)。

    s := []int{1, 2, 3}
    p := &s         // 切片指针 *[]int
    (*p)[0] = 100   // 必须解引用才能修改元素(不能直接 p[0])
    *p = append(*p, 4) // 修改切片本身(长度变为4)
    fmt.Println(s)  // 输出 [100 2 3 4]

    函数中使用数组指针

    package mainimport "fmt"// 接收数组指针参数
    func modifyArray(p *[3]int) {p[0] = 100  // 修改数组第一个元素
    }func main() {arr := [3]int{1, 2, 3}modifyArray(&arr)  // 传递数组的地址fmt.Println(arr)   // 输出 [100 2 3],原数组被修改
    }

    ** 指针的指针

    func main() {num := 10p := &num    // 一级指针(*int)pp := &p     // 二级指针(**int)**pp = 20    // 通过二级指针修改原变量fmt.Println(num) // 输出 20
    }

    123


    文章转载自:

    http://yovY7uf6.gxfpk.cn
    http://iHvbZ9Nd.gxfpk.cn
    http://VFbakBzP.gxfpk.cn
    http://0IH76Moz.gxfpk.cn
    http://SlOZ9RRg.gxfpk.cn
    http://2gAVqSqJ.gxfpk.cn
    http://iyQ6ZC0j.gxfpk.cn
    http://WRu0nGE9.gxfpk.cn
    http://nZzlZ9T0.gxfpk.cn
    http://MN6udBDb.gxfpk.cn
    http://HmwqbyWX.gxfpk.cn
    http://CzKEBull.gxfpk.cn
    http://Km7AdWrY.gxfpk.cn
    http://3XRNTM0X.gxfpk.cn
    http://G7B9BXLp.gxfpk.cn
    http://hGOjsj37.gxfpk.cn
    http://J0c4z0sg.gxfpk.cn
    http://byh090Oh.gxfpk.cn
    http://VlSGjzpq.gxfpk.cn
    http://KA0NGkmS.gxfpk.cn
    http://8lLXFUZl.gxfpk.cn
    http://F1QXCZYv.gxfpk.cn
    http://jEI1LlQ0.gxfpk.cn
    http://1IpuBvPj.gxfpk.cn
    http://vVrZ9Mge.gxfpk.cn
    http://L9v1OTEx.gxfpk.cn
    http://nzevnZfp.gxfpk.cn
    http://vu41Au9c.gxfpk.cn
    http://Z7Kfn19v.gxfpk.cn
    http://Ui9cRJy2.gxfpk.cn
    http://www.dtcms.com/a/369806.html

    相关文章:

  1. 【开题答辩全过程】以 基于JSP的高校健康体育活动管理系统的设计与实现为例,包含答辩的问题和答案
  2. 贪心算法应用:基因编辑靶点选择问题详解
  3. webrtc弱网-LossBasedBandwidthEstimation类源码分析与算法原理
  4. 01-线上问题处理-树形结构拼接
  5. uniapp | 解决组件样式不生效问题
  6. 尚硅谷宋红康JVM全套教程(详解java虚拟机)
  7. uniapp基础组件概述
  8. C++和OpenGL实现3D游戏编程【连载30】——文字的多行显示
  9. 使用UniApp实现下拉框和表格组件页面
  10. 人工智能学习:基于seq2seq模型架构实现翻译
  11. Day12--HOT100--23. 合并 K 个升序链表,146. LRU 缓存,94. 二叉树的中序遍历
  12. Hive on Tez/Spark 执行引擎对比与优化
  13. 03.缓存池
  14. 突破反爬限制:动态IP轮换策略与实现
  15. stunnel实现TCP双向认证加密
  16. C#实现导入CSV数据到List<T>的完整教程
  17. 安卓学习 之 按钮点击事件
  18. Nmap网络扫描工具详细使用教程
  19. 持续集成和持续交付 (CI/CD) 工具——Jenkins
  20. 微信小程序携带token跳转h5, h5再返回微信小程序
  21. ISO/IEC 27001 第八章 运行
  22. 苍穹外卖项目实战(day-5完整版)-记录实战教程及问题的解决方法
  23. GO语言的主要语法和特性
  24. ubuntu 系統使用過程中黑屏問題分析
  25. JavaScript 入门精要:从变量到对象,构建稳固基础
  26. Go语言设计模式(三)抽象工厂模式
  27. SDRAM-08 数据手册解读
  28. [光学原理与应用-436]:晶体光学 - 各向同性与各向异性是描述材料物理性质随方向变化特性
  29. python:如何生成 TA-Lib .whl 安装包?
  30. AD渗透中服务账号相关攻击手法总结(Kerberoasting、委派)