先看一段代码

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

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. css设置图片的高等于图片的高

    <div class="box"> <img src="img/2222.jpg" /> </div> .box { pos ...

  2. POJ 3468 A Simple Problem with Integers(线段树,区间更新,区间求和)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 67511   ...

  3. 删除文件时提示“找不到该项目”,怎么解决? 转摘自:http://jingyan.baidu.com/article/e4d08ffdf5ab470fd2f60df4.html

    故障现象:在使用Windows系统删除文件或者文件夹的时候,有时会出现“找不到该项目”的错误提示,可能再次“重试”也无济于事. 那么,接下来T库小编就为库友们简单概括一下出现该问题的原因. 故障原因: ...

  4. Linux安装篇超详细

    在此篇文章中主要介绍Linux系统的安装,以及学习大数据过程中Linux中常用的命令有哪些. 一.Linux(CentOs6.8)的安装 1.安装VMware虚拟机 虚拟机下载地址:https://p ...

  5. 使用canvas时, 如何用相对单位(rem, rpx)来适配不同机型

    使用canvas的api时, 使用的都是绝对数值, 如: 方法传参是坐标位置,不带单位,如ctx.translate(10,10); 那么此时, 我就需要将rem或rpx 转换成 px; 首先, 获取 ...

  6. C# 使用猫拨打电话

    主窗口一个textbox与btnstart按钮 代码是使用别人!只是去掉部分不用的!只用于拨号!用于辅助打电话! form1 using System; using System.Collection ...

  7. 【leetcode】995. Minimum Number of K Consecutive Bit Flips

    题目如下: In an array A containing only 0s and 1s, a K-bit flip consists of choosing a (contiguous) suba ...

  8. 【Flutter学习】基本组件之BottomNavigationBar底部导航栏

    一,概述 BottomNavigationBar即是底部导航栏控件,显示在页面底部的设计控件,用于在试图切换,底部导航栏包含多个标签.图标或者两者搭配的形式,简而言之提供了顶级视图之间的快速导航. 二 ...

  9. SCP-bzoj-1058

    项目编号:bzoj-1058 项目等级:Safe 项目描述: 戳这里 特殊收容措施: STL好题.维护两个set,一个存储数列里相邻元素差,另一个存储整个数列. 对于MIN_SORT_GAP操作,维护 ...

  10. Python基础教程(012)--排查手误错误

    前言 排查由于手误书写错误的方法 内容 手动输入错误的时候,颜色是红色 函数名称写错 1,颜色不一样 2,nameError错误 掌握知识点 学会在写代码的时候排查错误