请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于指针传递的问题

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回答

您的问题的关键在于理解这张图

https://img1.sycdn.imooc.com//szimg/5a7703dc0001a49313620782.jpg


指针&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的引用,都是遵循这样的行为。



1 回复 有任何疑惑可以回复我~
  • 提问者 小月肖 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-02-05 10:56:19
涛白 2018-02-03 19:42:31

这个问题应该和类型有关系。在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)


1 回复 有任何疑惑可以回复我~
  • 提问者 小月肖 #1
    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
    
    
    
    }
      
    
    
    可能我之前想问的是这种意思,之前没表达清除
    回复 有任何疑惑可以回复我~ 2018-02-03 22:29:29
  • 提问者 小月肖 #2
    代码块重新写在后面
    回复 有任何疑惑可以回复我~ 2018-02-03 22:30:39
提问者 小月肖 2018-02-03 22:29:52

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



}

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信