关于指针传递的问题

来源: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回答

ccmouse

2018-02-04

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

//img.mukewang.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
共1条回复

涛白

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)


1
2
小月肖
代码块重新写在后面
2018-02-03
共2条回复

小月肖

提问者

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



}

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程