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

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://www.xdnf.cn/news/20409.html

    相关文章:

  1. C语言初学者笔记【文件操作】
  2. ES6 核心特性详解:从变量声明到函数参数优化
  3. Go基础(⑤Consul)
  4. repo 学习教程
  5. 第2课:环境搭建:基于DeepSeek API的开发环境配置
  6. 【UAV】基于PX4+Ubuntu24.04.3的无人机制作的开发环境搭建
  7. Linux awk 命令使用说明
  8. 工业显示器在地铁电力监控与运维中的应用
  9. 每天五分钟深度学习:神经网络的梯度下降和反向传播算法
  10. Python实战:爬取百度热搜榜,制作动态可视化报告
  11. 企业级监控方案对比:Zabbix vs Prometheus
  12. (nice!!!)(LeetCode 面试经典 150 题 ) 130. 被围绕的区域(深度优先搜索dfs || 广度优先搜索bfs)
  13. uni-app倒计时公共组件 封装,倒计时组件
  14. 【Next】服务端接口
  15. scikit-learn零基础配置(含python、anaconda)
  16. 大电流场景首选:捷多邦解析厚铜 PCB 的应用优势
  17. 【PCIe EP 设备入门学习专栏 -- 8.1.2 PCIe EP 通路详细介绍】
  18. v0.29.1 敏感词性能优化之内部类+迭代器内部类
  19. 中州养老项目:利用Redis解决权限接口响应慢的问题
  20. Pandas基础(安装、导入Pandas、读取数据、查看数据)
  21. 一、算法与数据结构的本质关系:灵魂、肉体与图书馆
  22. 3、工厂模式
  23. redis-----事务
  24. SDRAM-08 数据手册解读
  25. python系列之综合项目:智能个人任务管理系统
  26. HTML标签之超链接
  27. 《UE5_C++多人TPS完整教程》学习笔记48 ——《P49 瞄准偏移(Aim Offset)》
  28. 【LeetCode热题100道笔记】二叉搜索树中第 K 小的元素
  29. Flink-新增 Kafka source 引发状态丢失导致启动失败
  30. 2.2 Web和Http