GoLang之取地址符、指针
文章目录
- GoLang之取地址符&、指针
- 1.int取地址符&
- 2.指针声明
- 3.int指针使用
- 4.空指针
- 5.指向指针的指针
- 6.三重指针
- 7.引用变量
- 8.Go语言没有引用变量
- 9.&使用注意事项
- 9.1常量不可寻址
- 9.2字符串变量可寻址
- 9.3函数或方法不可寻址
- 9.4基本类型字面量不可寻址
GoLang之取地址符&、指针
注:本文以Windos系统上Go SDK1.8进行讲解
1.int取地址符&
变量是一种使用方便的占位符,用于引用计算机内存地址。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
以下实例演示了变量在内存中地址:
func main() {var a intfmt.Printf("变量的地址: %x\n", &a) //变量的地址: c000016098a = 4fmt.Printf("变量的地址: %x\n", &a)//变量的地址: c000016098
}
2.指针声明
一个指针变量指向了一个值的内存地址。
类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
*var-type 为指针类型,var_name 为指针变量名
var var_name *var-type
var ip *int /* 指向整型*/
var fp *float32 /* 指向浮点型 */
3.int指针使用
指针使用流程:
定义指针变量。
为指针变量赋变量。
访问指针变量中指向地址的值。
func main() {var a int = 20 /* 声明实际变量 */var ip *int /* 声明指针变量 */ip = &a /* 指针变量的存储地址 *//* 使用指针访问变量 */fmt.Printf("*ip 变量的值: %d\n", *ip) //*ip 变量的值: 20/* 值的地址 */fmt.Printf("a 变量的地址是: %p\n", &a) //a 变量的地址是: 0xc000102058/* 指针变量里存的地址 */fmt.Printf("ip 变量里储存的地址: %p\n", ip) //ip 变量里储存的地址: 0xc000102058/* 指针变量的地址 */fmt.Printf("ip 变量的地址: %p\n", &ip) //ip 变量的地址: 0xc00012e018}
4.空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
func main() {var ptr *intif ptr == nil {fmt.Println("ptr==nil")} else if ptr != nil {fmt.Println("ptr!=nil")}fmt.Println(ptr)fmt.Printf("ptr 的值为 : %x\n", ptr)/*输出以下:ptr==nil<nil>ptr 的值为 : 0*/
}
5.指向指针的指针
如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址:
指向指针的指针变量声明格式如下:
var ptr **int;
package mainimport "fmt"func main() {var a intvar ptr *intvar pptr **inta = 3000/* 指针 ptr 地址 */ptr = &a/* 指向指针 ptr 地址 */pptr = &ptr/* 获取 pptr 的值 */fmt.Printf("变量 a = %d\n", a )//输出:变量 a = 3000fmt.Printf("指针变量 *ptr = %d\n", *ptr )//输出:指针变量 *ptr = 3000fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)//输出:指向指针的指针变量 **pptr = 3000
}
6.三重指针
pt3 - > pto - > ptr - >变量a
package mainimport "fmt"
func main(){var a int = 5//把ptr指针 指向ss所在地址var ptr *int = &a//开辟一个新的指针,指向ptr指针指向的地方var pts *int = ptr //二级指针,指向一个地址,这个地址存储的是一级指针的地址var pto **int = &ptr//三级指针,指向一个地址,这个地址存储的是二级指针的地址,二级指针同上var pt3 ***int = &ptofmt.Println("a的地址:",&a,"\n 值", a, "\n\n","ptr指针所在地址:",&ptr,"\n ptr指向的地址:",ptr,"\n ptr指针指向地址对应的值",*ptr,"\n\n", "pts指针所在地址:",&pts,"\n pts指向的地址:", pts,"\n pts指针指向地址对应的值:",*pts,"\n\n", "pto指针所在地址:",&pto,"\n pto指向的指针(ptr)的存储地址:",pto, "\n pto指向的指针(ptr)所指向的地址: " ,*pto, "\n pto最终指向的地址对应的值(a)",**pto,"\n\n","pt3指针所在的地址:",&pt3,"\n pt3指向的指针(pto)的地址:",pt3,//等于&*pt3,"\n pt3指向的指针(pto)所指向的指针的(ptr)地址", *pt3, //等于&**pt3,"\n pt3指向的指针(pto)所指向的指针(ptr)所指向的地址(a):",**pt3, //等于&***pt3,"\n pt3最终指向的地址对应的值(a)", ***pt3)}
/*
执行结果:a的地址: 0xc00009a008 值 5 ptr指针所在地址: 0xc000092010 ptr指向的地址: 0xc00009a008 ptr指针指向地址对应的值 5 pts指针所在地址: 0xc000092018 pts指向的地址: 0xc00009a008 pts指针指向地址对应的值: 5 pto指针所在地址: 0xc000092020 pto指向的指针(ptr)的存储地址: 0xc000092010 pto指向的指针(ptr)所指向的地址: 0xc00009a008 pto最终指向的地址对应的值(a) 5 pt3指针所在的地址: 0xc000092028 pt3指向的指针(pto)的地址: 0xc000092020 pt3指向的指针(pto)所指向的指针的(ptr)地址 0xc000092010 pt3指向的指针(pto)所指向的指针(ptr)所指向的地址(a): 0xc00009a008 pt3最终指向的地址对应的值(a) 5*/
7.引用变量
在一些开发语言中(比如 C++),对已存在的变量可以声明别名,这种别名称为引用变量。
可以看到 a、b 和 c 都指向相同的内存位置。对 a 的写操作会影响 b 和 c。
include <stdio.h>int main() {int a = 10;int &b = a;int &c = b;printf("%p %p %p\n", &a, &b, &c); // 0x7ffe114f0b14 0x7ffe114f0b14 0x7ffe114f0b14return 0;
}
8.Go语言没有引用变量
与 C++ 不同,Go 程序中定义的每个变量都占用一个惟一的内存位置。
func main() {var a, b, c intfmt.Println(&a, &b, &c) // 0x1040a124 0x1040a128 0x1040a12c
}
创建两个共享同一内存位置的变量是不可能的。但是可以创建两个指向同一内存位置的变量,不过这与两个变量共享同一内存位置是不同的。
下面这段代码,b 和 c 都具有相同的值 ,即变量 a 的地址,但 a、c 存储在内存中不同的位置。改变 b 的内容不会影响到 c。
func main() {var a intvar b, c = &a, &afmt.Println(b, c) // 0x1040a124 0x1040a124fmt.Println(&b, &c) // 0x1040c108 0x1040c110
}
9.&使用注意事项
9.1常量不可寻址
9.2字符串变量可寻址
func main() {var s string = "qqqq"fmt.Println(&s) //0xc00005a250
}
9.3函数或方法不可寻址
9.4基本类型字面量不可寻址
GoLang之取地址符、指针相关推荐
- 取地址符和解引用符的区别_(&)和解引用(*)运算符的地址以及C中的指针...
取地址符和解引用符的区别 Here, we are discussing about the two most useful operators with the pointers, why and ...
- 变量与指针、取值符与取地址符
变量与指针.取值符与取地址符 一.基础知识 二.实例 其他 by HPC_ZY 也是偶然,在一个项目中需要多次交换二维数组中的值,逐个操作确实耗时,就想能不能利用指针操作快速交换.成功后写此文,记录分 ...
- C语言中 指针变量 取地址符的用法 *指针变量名的用法
文章目录 总结 Intro Code 图示 总结 众所周知,内存可以看成一个一个相邻的格子(类比Excel),而数据就存储于这些格子之中(size大的变量占用格子数多,size小就占用小).而每个格子 ...
- c语言函数变量地址符,C语言中取地址符做函数形参?—— 引用的讨论
取地址符&做函数形参? C语言强大且危险 引入 这个问题花去了整整一天的研究. 先看一段严蔚敏的<数据结构>中栈的例程: 这里面的&S第一遍看的时候想当然的认为是取了SqS ...
- 【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符的作用、C语言中的 联合体
本章目录: 1. c语言中%x.%c.%d.%x等等等 2. c语言取地址符&的作用 3. 了解 C语言中的 联合体 3.1 什么是联合体? 3.2 定义 3.2.1 举例 3.3 初始化联合 ...
- C语言加取址符的作用,C语言中指针和取地址符的关系
一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...
- c语言地址符作用,C语言中指针和取地址符的关系
一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...
- golang中new、make及取地址符()
new简介及使用方式 new() 用于返回类型指针,这个操作:分两步,第一步:初始化一个变量为零的值,第二步:生成一个指向类型变量的地址. &Type 返回类型变量的地址,这个操作:分两步,第 ...
- C++ 中的:“引用” 和“取地址符”的区别和作用
引用 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. &作为引用的时候,必须在定义时候就进行初始化,若不进行初始化则会编译报错. int N; int &r ...
- Go 学习笔记(5)— 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、取地址和指针运算符
1. Go 运算符分类 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 1.1 算术运算符 下表列出了所有Go语言的算术运算符.假定 A 值为 10, ...
最新文章
- JAVA处理 M_一次Java内存泄露处理手记
- php +号在传输参数的过程中被变为空格了_编程难学?web相关知识,跟着淼哥学php全栈之路6...
- 算法和时间复杂度概念(一级)
- controller属于哪一层_孺教网分享|家长层次有五层,家长们都来看看,你属于哪一层?...
- 模拟断电oracle数据不一致,Oracle数据库案例整理-Oracle系统运行时故障-断电导致数据文件状态变为RECOVER...
- 算术编码原理与实现【转载】
- 38..Node.js工具模块---底层的网络通信--Net模块
- pytroch model??(查看官方模型写法)
- 传智播客 C/C++学习笔记 一级指针易错模型分析_重点
- Qt下使用GDB远程调试ARM板
- 被认为是世界史上50个最伟大的发明有哪些?
- python迅雷下载任务出错_迅雷下载任务出错的原因和解决方法 来研究下吧
- 图像处理——gamma矫正
- C++--struct的用法
- 手把手教你如何用python制作自动翻译程序
- 关于α测试与β测试的区别
- 【积水成渊-逐步定制自己的Emacs神器】3:为Emacs安装扩展
- 快速找到python第三方库
- 【Caffe细致入微】Solver_Step
- c#手写web内网网站映射,穿透服务器(一)
热门文章
- win10 dnf服务器未响应怎么办,手把手研习win10系统DNF游戏死机的具体教程
- Django Django文档
- 利用jsonp跨域访问
- 超能陆战队:迪士尼画风的漫威英雄
- 个人网站音乐服务器,自己的私人音乐流媒体服务,这才是多少音乐者的梦寐以求的...
- 苹果「Find My iPhone」立功,帮警察追踪偷车嫌犯
- 1212 无向图最小生成树
- advanced option里面没有resolution
- Go语言之interface详解
- 微星网卡linux驱动,微星b360系列win10无法安装网卡驱动解决方法_武汉久龙电脑维修中心...