slice的小问题

package main

import (
    "fmt"
)

func FuncSlice(s *[]int) {
    fmt.Println(&s)
}
func main() {
    a := &[]int{0, 1, 2, 3}
    fmt.Println(&a)
    FuncSlice(a)
    fmt.Print(&a)
}

结果:

/usr/local/go/bin/go run /Users/Apple/gowork/src/just/mian.go
0xc82002c020
0xc82002c030
0xc82002c020
Process finished with exit code 0

为什么传递到函数内部去的指针地址会变

已邀请:

sryan - backmir

赞同来自: 九命猫 toukii

c语言的实参形参了解下就知道了

所有的参数都是值拷贝,参数当然和实参地址不同了

east

赞同来自: 九命猫 layneYoo

因为 Go 里面的函数调用都是值传递,所以都会变

layneYoo

赞同来自: toukii

一、fmt.Println(&a) 二、FuncSlice(a) 三、fmt.Print(&a) 首先 a 本身声明就是slice的地址; 第一个和第三个都输出的是a的地址,相当于C中的 **(指针的指针),一三区别就在是不是换行; 第二个传入的虽然传入的是slice的地址,但是Go处理依然是看作slice处理,所以输出的是slice的地址,相当于C的 &a[](指向数组的指针); 不知道这样解释是否正确,望指正:)

smallfish1 - 国内 Prometheus 首席布道师,是电子书《Promethues 实战》和 《Go 零基础入门》作者,另外对 SRE,自动化运维有深入理解。

赞同来自: qi19901212

提问之前,最好先 code format, 方便大家阅读,也能更好的回答你问题。 答案就像大家说的,你的参数声明为指针的指针,值拷贝

九命猫

赞同来自:

你那是指针的指针

superryanguo - 80后IT男

赞同来自:

为何写一些奇怪的代码?验证指针功能也不是这种方式写吧?感觉基础知识不过关一样

godonggua - java,go爱好者

赞同来自:

数数看用了几个 取地址符 。。。。

changjixiong - 时常做白日梦的程序员

赞同来自:

a和s是两个指向同一个内存地址的指针,然而a和s作为两个变量,自身的地址是不一样的。

数组的地址是xxx
a指向 xxx
s也指向 xxx
但是a的内存地址是x1
s的内存地址是x2

要回复问题请先登录注册