package mainimport ( "fmt")func main() { x, y := 1, 2 fmt.Printf("x替换前的地址=%p\n",&x) fmt.Printf("y替换前的地址=%p\n",&y) swap(&x, &y) fmt.Println(x, y) fmt.Printf("x替换后的地址=%p\n",&x) fmt.Printf("y替换后的地址=%p\n",&y)}func swap(a, b *int) { fmt.Printf("a变量自身的地址=%p\n", &a) fmt.Printf("b变量自身的地址=%p\n", &b) fmt.Printf("a替换前的x赋予的地址=%p\n", a) fmt.Printf("b替换前的y赋予的地址=%p\n", b) fmt.Printf("a替换前的值=%d\n", *a) fmt.Printf("b替换前的值=%d\n", *b) *b, *a = *a, *b fmt.Printf("a变量自身的地址=%p\n", &a) fmt.Printf("b变量自身的地址=%p\n", &b) fmt.Printf("a替换后的x赋予的地址=%p\n", a) fmt.Printf("b替换后的y赋予的地址=%p\n", b) fmt.Printf("a替换后的值=%d\n", *a) fmt.Printf("b替换后的值=%d\n", *b)}
输入后果如下:
x替换前的地址=0xc0000a0068y替换前的地址=0xc0000a0080a变量自身的地址=0xc0000ca020b变量自身的地址=0xc0000ca028a替换前的x赋予的地址=0xc0000a0068b替换前的y赋予的地址=0xc0000a0080a替换前的值=1b替换前的值=2a变量自身的地址=0xc0000ca020b变量自身的地址=0xc0000ca028a替换后的x赋予的地址=0xc0000a0068b替换后的y赋予的地址=0xc0000a0080a替换后的值=2b替换后的值=12 1x替换后的地址=0xc0000a0068y替换后的地址=0xc0000a0080
替换胜利。
上面将swap办法中的*b, *a = *a, *b
改为b, a = a, b
输入后果如下:
x替换前的地址=0xc00000a0c0y替换前的地址=0xc00000a0c8a变量自身的地址=0xc000006030b变量自身的地址=0xc000006038a替换前的x赋予的地址=0xc00000a0c0b替换前的y赋予的地址=0xc00000a0c8a替换前的值=1b替换前的值=2a变量自身的地址=0xc000006030b变量自身的地址=0xc000006038a替换后的x赋予的地址=0xc00000a0c8b替换后的y赋予的地址=0xc00000a0c0a替换后的值=2b替换后的值=11 2x替换后的地址=0xc00000a0c0y替换后的地址=0xc00000a0c8
替换失败。
内存图解析
咱们先看b,a=a,b这种状况
从第二种后果打印咱们晓得,a,b本人自身也有地址,区别在于他们的地址指向的值是x,y的地址,所以b,a=a,b这种相当于把内存这一列的值进行对调(也就是0xc00000a0c0和0xc00000a0c8对调一下),然而ab自身地址没有扭转,因为内存的地址值变了,所以ab的值所指向的值也对调了(也就是a,b的值对调了),从图上来说,ab与xy没有关系
咱们再看b,a=a,b这种状况
咱们先看一个知识点:
a = b这句话的含意:操作符作为右值时,意义是取指针的值,作为左值时,也就是放在赋值操作符的右边时,示意 a 指针指向的变量。其实归纳起来,操作符的基本意义就是操作指针指向的变量。当操作在右值时,就是取指向变量的值,当操作在左值时,就是将值设置给指向的变量。
简略来说就是:取b指针的值(这里值为2), 赋给a指针指向的变量,a指针指向的变量就是x呀,所以相当于把2赋给x 同理b = a也是这个情理
作者:蓝色记忆
链接:https://juejin.cn/post/684490...
起源:稀土掘金
著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。