go中间的&和*
package main
import "fmt"
func main() {
var a int = 1
var b *int = &a
var c **int = &b
var x int = *b
fmt.Println("a = ",a)
fmt.Println("&a = ",&a)
fmt.Println("*&a = ",*&a)
fmt.Println("b = ",b)
fmt.Println("&b = ",&b)
fmt.Println("*&b = ",*&b)
fmt.Println("*b = ",*b)
fmt.Println("c = ",c)
fmt.Println("*c = ",*c)
fmt.Println("&c = ",&c)
fmt.Println("*&c = ",*&c)
fmt.Println("**c = ",**c)
fmt.Println("***&*&*&*&c = ",***&*&*&*&*&c)
fmt.Println("x = ",x)
}
解释
理论
&符号的意思是对变量取地址,如:变量a的地址是&a*符号的意思是对指针取值,如:*&a,就是a变量所在地址的值,当然也就是a的值了
简单的解释
*和 & 可以互相抵消,同时注意,*&可以抵消掉,但&*是不可以抵消的a和*&a是一样的,都是a的值,值为1 (因为*&互相抵消掉了)
同理,a和*&*&*&*&a是一样的,都是1 (因为4个*&互相抵消掉了)
展开
因为有var b *int = &a
所以a和*&a和*b是一样的,都是a的值,值为1 (把b当做&a看)
再次展开
因为有var c **int = &b
所以**c和**&b是一样的,把&约去后
会发现**c和`b是一样的 (从这里也不难看出,c和b也是一样的)&a
又因为上面得到的和b是一样的**c
所以和&a是一样的,再次把*&约去后**c和a`是一样的,都是1
不信你试试?
公布结果
运行的结果内的地址值(0xc200开头的)可能会因不同机器运行而不同,你懂的
$ go run main.go
a = 1
&a = 0xc200000018
*&a = 1
b = 0xc200000018
&b = 0xc200000020
*&b = 0xc200000018
*b = 1
c = 0xc200000020
*c = 0xc200000018
&c = 0xc200000028
*&c = 0xc200000020
**c = 1
***&*&*&*&c = 1
x = 1
两个符号抵消顺序
*&可以在任何时间抵消掉,但&*不可以被抵消的,因为顺序不对
fmt.Println("*&a\t=\t",*&a) //成功抵消掉,打印出1,即a的值
fmt.Println("&*a\t=\t",&*a) //无法抵消,会报错
随机推荐
- c语言中各个类型的sizeof长度
#include <stdio.h> int main() { printf("\nA Char is %lu bytes", sizeof( char )); ...
- 20150825 C# 调用带参数的存储过程 模板
////// exec proceudre2 //System.Data.SqlClient.SqlConnection sqlcon = new Sys ...
- C/C++ 调用qsort/sort 对字符数组排序的cmp函数写法
这个问题屡次碰到解决之后再次遇到又忘记怎么弄了,这次打算彻底搞清楚. ·C 首先对所谓字符数组的排序应该是对(char)*a[]数组而非(char)a[][]进行的排序,后者是无法直接调用qsort实 ...
- ThreadPoolExecutor的学习
Java多线程之ThreadPoolExecutor 线程池的作用就是使用更少的线程, 来执行更多的任务, 以达到线程的充分利用. 从ThreadPoolExecutor类的构造方法学习: /** * ...
- RabbitMQ术语
工作队列:Working Queue 分配:多个客户端接收同一个Queue,如何做负载均衡(分配). Round-robin分配:多个接收端接收同一个Queue时,采用了Round-robin ...
- C语言的编译过程
- vs配置opencv
配置OpenCv: 一.新建工程 无论是mfc还是控制台程序都可以. 二.下载opencb,安装在非空格路径下面 解压出来有两个文件夹:build和source,主要用到build,build-x86 ...
- 改变HTML
改变HTML 1.改变HTML输出流 JavaScript可以创建动态的HTML内容.(注意:不要在加载文档后使用document.write(),这会覆盖文档.) <%@ page langu ...
- CentOS 7 网络配置方法
[root@zookeeper network-scripts]# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 输入以下文本: TYPE=Ethe ...
- JSON 数据解析
json解析的几种方法(将字符串解析为object对象和objectArray对象数组) 1 Android自带api 包名 org.json // json = {"school&quo ...