求问:指针作为函数参数的问题

tooyan · · 918 次点击
wxb
坚持是一种品格
```go package main import "fmt" func swap(newA, newB *int) (*int, *int) { // 这里的newA执行的是调用中传递进来的变量地址,也就是说main中传递尽量的变量a得的地址(&a)被复制保存到了这个newA变量,newB同理 fmt.Printf("a2: %v %p\n", *newA, newA) // 所以这里输出的和main输出保持一致;是:a2: 3 0xc0000120b8 // 这一步将newA和newB执行的内存地址做了交互;也就是说newA和newB变量的指向做了变更 newA, newB = newB, newA // 此时打印newA时,其实打印的是调用者最初传递进来的newB执行内存地址的值和地址 fmt.Printf("a3: %v %p\n", *newA, newA) return newA, newB } func main() { a := 3 b := 4 // 这一步不用解释 fmt.Printf("a1: %v %p\n", a, &a) // c指向的是b内存地址;d指向的是a内存地址 c, d := swap(&a, &b) // 这里a的内存地址没变,所以值也不变。记住上面swap(&a, &b)调用时,是将&a, &b的内存地址传给了swap函数的形参newA和newB;swap内部交互newA和newB变量的内存指向,并不会影响这里a和b的指向(也就是一楼说的“此a,b非彼a,b”);但是如果swap中修改newA或者newB指向内存地址中的值,就会影响这里a和b的值 fmt.Printf("a4: %v %p\n", a, &a) fmt.Println(*c, *d) } ``` 稍微做个修改,楼主可能会清晰点
#5
更多评论
楼主可能对指针和参数传递理解不深? 一句话解释这个就是此a,b非彼a,b
#1
&a就是指向a的地址啊,而且第一行和第二行打印的值和地址都是一致的。 指针传参,修改的不就是指针指向的内存吗
#2