Go基础(④指针)

简单示例

Go 复制代码
package main

import "fmt"

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

import "fmt"

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

函数中使用指针

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

Go 复制代码
package main

import "fmt"

// 传递指针参数
func addOne(p *int) {
    *p = *p + 1  // 修改指针指向的变量的值
}

func main() {
    x := 5
    addOne(&x)   // 传递x的地址
    fmt.Println(x)  // 输出:6(x的值被函数内部修改了)
}

数组指针的基本用法

数组指针

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

Go 复制代码
package main

import "fmt"

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

切片指针

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

Go 复制代码
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]

函数中使用数组指针

Go 复制代码
package main

import "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],原数组被修改
}

** 指针的指针

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

123

相关推荐
神仙别闹2 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
伞伞悦读3 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
GreenTea3 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
码事漫谈3 小时前
FDE:一个缩写,两种命运
后端
名字还没想好☜4 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
web守墓人4 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
明月_清风5 小时前
为什么最近开始关注 JEV?几个实战案例告诉你答案
人工智能·后端
2601_966949655 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
m0_734571766 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
GetcharZp6 小时前
5 分钟拥有自己的 S3:RustFS 上手(MinIO 的 Rust 替代,Apache 2.0 可商用)
后端