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

要回复问题请先登录注册