关于指针传递的问题
来源:2-7 指针

小月肖
2018-02-03
type A struct {
a int
b int
}
func main() {
var AA A
AA.a=1
AA.b=2
fmt.Println(AA.a,"--",AA.b)
F(&AA)
fmt.Println(AA.a,"--",AA.b)
}
func F(pa *A) {
pa=nil
}
这个pa是个复制的A的地址? 我可以修改pa.a pa.b 为什么我不能修改pa? 将其地址变为空 对于这个不是很理解 既然都可以修改地址了 pa这个地址不能修改码?
3回答
-
您的问题的关键在于理解这张图
指针&a和pa,他们本身都是变量,在64位机上 各 占据64位的空间。他们里面的具体值相同,都是a这个变量的地址。在调用f(&a)的时候,系统把a的地址拷贝一份到函数f里面,变成pa的值。
我们说*pa=b的时候,(注意相对于你后来贴的代码应该是var b A)我们把pa指向的变量,也就是a,他的值变成b的值。所以main里面a的值变了。这里我们没有改变pa指向谁,但是改变了pa指向的变量的值。
我们说pa=&b的时候,我们看上图,我们改变了pa指向的人,在竖线右边pa不再指向a,而是指向b,而在竖线左边,当然没人动过a的值,因此a的值不变。这里我们改变了pa指向谁。
这个问题不是具体的设计,而是我们把指针看成变量以后很自然的结果。在几乎所有语言中,比如c/c++的指针,java/python的引用,都是遵循这样的行为。
112018-02-05 -
涛白
2018-02-03
这个问题应该和类型有关系。在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。对此官方文档有明确的说明:http://pkg.golang.org/pkg/builtin/#Type
你可以写:
var bA *A = nil //指针
fmt.Println(bA)但是不能写:
var cA A = nil //struct 类型
fmt.Println(cA)122018-02-03 -
小月肖
提问者
2018-02-03
package main
import (
"fmt"
)
type A struct {
a int
b int
}
func main() {
var aa A
aa.a = 1
aa.b = 2
fmt.Println(aa.a, "-", aa.b)
F(&aa)
fmt.Println(aa.a, "-", aa.b)
}
func F(pa *A) {
var pb A
/*当作该pb是有数据的,模拟给他数据*/
pb.a=3
pb.b=4
/*其实之前想问的是这种情况*/
*pa=pb
/*我测试过这种情况,值是没有发生变化的,pa不就是指针吗?可是为什么这样就不成立了*/
pa=&pb
}00
相似问题