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) //无法抵消,会报错
go 区分指针的更多相关文章
- Const用法总结(快速区分指针常量与常量指针)
想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~ 其实const的用处还真不少,好好捋顺一下会有很大的帮助. 有时候我们希望定义一种常量,它的值不能被修改,这 ...
- C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
#include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...
- iOS学习07之C语言指针
本次随笔主要是为了学习和理解C语言中的指针,指针树状图如下: 1.访问数据的两种方式 1> 直接访问:定义变量后,直接访问变量 ; printf("a = %d\n", a) ...
- (一)二维数组&&指针数组与数组指针
一.首先我们从字面意思理解一下什么是指针数组什么是数组指针 1.指针数组:本质是一个数组,数组中的每一个元素是一个指针. 2.数组指针:本质是一个指针,而指针指向一个数组. 二.我们该怎么区分指针数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- iOS学习之C语言指针
访问数据的两种方式: 1.直接访问: 2.间接访问:先找到内存地址,根据地址访问存储单元.(内存地址 被称为指针) 定义指针变量: 类型修饰符 *指针变量名 = NULL; NULL表示空指针,相当 ...
- 浅谈C中的指针和数组(一)
本文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html 在原文的基础上加入自己的想法作为修改. 指针是C/C ...
- 【嵌入式开发】C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
- C/C++中指针和java的引用区别
C++指针 要区分指针变量和指针变量所指对象. 指针变量先是一个变量,它有自己的地址和存储的内容,所以要想清楚是改变指针变量的值(即地址),还是改变指针变量所指对象的值. #include < ...
随机推荐
- HDU 1398 Square Coins(DP)
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDFS文件的基本操作
HDFS文件的基本操作: package wjn; import java.io.BufferedInputStream; import java.io.BufferedReader; import ...
- C中整数的溢出
/** * 整数的溢出 */ #include <stdio.h> int main(int argc, char *argv[]) { short i = -24; // 将-24以无符 ...
- A new session could not be created. (Original error: Could not find a connected Android device.)
1 终端执行adb devices 查看知否看到设备 1 查看手机 的开发者 usb调试功能是否打卡 2 重启电脑,cmd 执行 adb devices 重新打开
- 59th python下graphviz安装 砖
原文 摘录 感谢分享: https://www.cnblogs.com/liusx0303/p/9155305.html 参考链接:https://blog.csdn.net/u01325041 ...
- 眼前一亮的WI微逸输入法
手机上找了好多输入法,比如百度,谷歌,手心等,百度太花哨,pass:谷歌不知为何反映慢,也pass:手心颜值低,哈哈!!偶遇WI输入法,试用了不错.故推荐之,下面为界面截图:
- 人生苦短_我用Python_list(列表)_002
# coding=utf-8 # 列表 list 列表函数 # 列表的特性: 可以有任何类型的值 可以更改 # 可以更改.增加.删除.修改 # 增加 append 直接在尾巴增加 list_1 = [ ...
- 【leetcode】640. Solve the Equation
题目如下: 解题思路:本题的思路就是解析字符串,然后是小学时候学的解方程的思想,以"2x+3x-6x+1=x+2",先把左右两边的x项和非x项进行合并,得到"-x+1=x ...
- springDataRedis 依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit ...
- PHP clearstatcache() 函数
定义和用法 clearstatcache() 函数清除文件状态缓存. PHP 会缓存某些函数的返回信息,以便提供更高的性能.但是有时候,比如在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被 ...