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

赞同来自: qi19901212

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

九命猫

赞同来自:

你那是指针的指针

superryanguo - 80后IT男

赞同来自:

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

godonggua - java,go爱好者

赞同来自:

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

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

赞同来自:

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


数组的地址是xxx

a指向 xxx

s也指向 xxx

但是a的内存地址是x1

s的内存地址是x2

要回复问题请先登录注册