先看一段代码

先放一段代码,人工运行一下,看看自己能做对几题?

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是一样的 (从这里也不难看出,cb也是一样的) 又因为上面得到的&ab是一样的 所以**c&a是一样的,再次把*&约去后**ca`是一样的,都是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) //无法抵消,会报错

go 区分指针的更多相关文章

  1. Const用法总结(快速区分指针常量与常量指针)

    想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...

  2. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组

    #include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...

  3. iOS学习07之C语言指针

    本次随笔主要是为了学习和理解C语言中的指针,指针树状图如下: 1.访问数据的两种方式 1> 直接访问:定义变量后,直接访问变量 ; printf("a = %d\n", a) ...

  4. (一)二维数组&&指针数组与数组指针

    一.首先我们从字面意思理解一下什么是指针数组什么是数组指针 1.指针数组:本质是一个数组,数组中的每一个元素是一个指针. 2.数组指针:本质是一个指针,而指针指向一个数组. 二.我们该怎么区分指针数组 ...

  5. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  6. iOS学习之C语言指针

     访问数据的两种方式: 1.直接访问: 2.间接访问:先找到内存地址,根据地址访问存储单元.(内存地址 被称为指针) 定义指针变量: 类型修饰符 *指针变量名 = NULL; NULL表示空指针,相当 ...

  7. 浅谈C中的指针和数组(一)

    本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...

  8. 【嵌入式开发】C语言 指针数组 多维数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...

  9. C/C++中指针和java的引用区别

    C++指针  要区分指针变量和指针变量所指对象. 指针变量先是一个变量,它有自己的地址和存储的内容,所以要想清楚是改变指针变量的值(即地址),还是改变指针变量所指对象的值. #include < ...

随机推荐

  1. vue证明题五,组件传值与绑定

    上文中写了一个input组件,该组件需要复用,但是并不是每个组件都相同的 比如我定义了一个组件,是个矿泉水瓶子,这个瓶子分为大中小三个号,定义了三种瓶子的容积,定义了必须有瓶盖,瓶口,瓶子质地 但是瓶 ...

  2. sleep - 延迟指定数量的时间

    总览 (SYNOPSIS) sleep [OPTION]... NUMBER[SUFFIX] 描述 (DESCRIPTION) 暂停 NUMBER 秒. SUFFIX 如果 是 s, 指 暂停 的 秒 ...

  3. Linux操作练习

    打印显示当前时间,格式是:20181209211008 [root@Centos7 ~]#date "+%Y%m%d%H%M%S" 实现晚上20:30自动关机 [root@Cent ...

  4. 七、OIDC

    在 OAuth 中,这些授权被称为scope. OpenID-Connect也有自己特殊的scope--openid , 它必须在第一次请求“身份鉴别服务器”(Identity Provider,简称 ...

  5. Java线程的优先级设置遵循什么原则?

    Java线程的优先级设置遵从下述原则: (1) 线程创建时,子线程继承父线程的优先级 (2) 线程创建后,可在程序中通过调用setPriority( )方法改变线程的优先级 (3) 线程的优先级是1~ ...

  6. python-django_rest_framework中的request/Response

    rest_framework中的request是被rest_framework再次封装过的,并在原request上添加了许多别的属性: (原Django中的request可用request._requ ...

  7. python 发送json数据操作实例分析 - python

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 本文实例讲述了python 发送json数据操作.分享给大家供大家参考,具体如下: # !/usr/bin/env py ...

  8. 双11大考 POLARDB分钟级弹性让企业轻松扩展

    无处不在的脉冲计算 阿里有双11,中国有春运,高考后有分数出来的那天,歌迷心中有周杰伦演唱会门票在线开售之时....有人的地方就有江湖,有人的地方也有脉冲计算,这些热点事件背后都需要大量的计算资源给予 ...

  9. SPOJ - VLATTICE (莫比乌斯反演)

    Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many latt ...

  10. TextView详解

    android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phone/map/all)android: ...