文章目录

  • 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之取地址符、指针相关推荐

  1. 取地址符和解引用符的区别_(&)和解引用(*)运算符的地址以及C中的指针...

    取地址符和解引用符的区别 Here, we are discussing about the two most useful operators with the pointers, why and ...

  2. 变量与指针、取值符与取地址符

    变量与指针.取值符与取地址符 一.基础知识 二.实例 其他 by HPC_ZY 也是偶然,在一个项目中需要多次交换二维数组中的值,逐个操作确实耗时,就想能不能利用指针操作快速交换.成功后写此文,记录分 ...

  3. C语言中 指针变量 取地址符的用法 *指针变量名的用法

    文章目录 总结 Intro Code 图示 总结 众所周知,内存可以看成一个一个相邻的格子(类比Excel),而数据就存储于这些格子之中(size大的变量占用格子数多,size小就占用小).而每个格子 ...

  4. c语言函数变量地址符,C语言中取地址符做函数形参?—— 引用的讨论

    取地址符&做函数形参? C语言强大且危险 引入 这个问题花去了整整一天的研究. 先看一段严蔚敏的<数据结构>中栈的例程: 这里面的&S第一遍看的时候想当然的认为是取了SqS ...

  5. 【重温经典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 初始化联合 ...

  6. C语言加取址符的作用,C语言中指针和取地址符的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  7. c语言地址符作用,C语言中指针和取地址符的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  8. golang中new、make及取地址符()

    new简介及使用方式 new() 用于返回类型指针,这个操作:分两步,第一步:初始化一个变量为零的值,第二步:生成一个指向类型变量的地址. &Type 返回类型变量的地址,这个操作:分两步,第 ...

  9. C++ 中的:“引用” 和“取地址符”的区别和作用

    引用 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. &作为引用的时候,必须在定义时候就进行初始化,若不进行初始化则会编译报错. int N; int &r ...

  10. Go 学习笔记(5)— 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、取地址和指针运算符

    1. Go 运算符分类 Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 1.1 算术运算符 下表列出了所有Go语言的算术运算符.假定 A 值为 10, ...

最新文章

  1. JAVA处理 M_一次Java内存泄露处理手记
  2. php +号在传输参数的过程中被变为空格了_编程难学?web相关知识,跟着淼哥学php全栈之路6...
  3. 算法和时间复杂度概念(一级)
  4. controller属于哪一层_孺教网分享|家长层次有五层,家长们都来看看,你属于哪一层?...
  5. 模拟断电oracle数据不一致,Oracle数据库案例整理-Oracle系统运行时故障-断电导致数据文件状态变为RECOVER...
  6. 算术编码原理与实现【转载】
  7. 38..Node.js工具模块---底层的网络通信--Net模块
  8. pytroch model??(查看官方模型写法)
  9. 传智播客 C/C++学习笔记 一级指针易错模型分析_重点
  10. Qt下使用GDB远程调试ARM板
  11. 被认为是世界史上50个最伟大的发明有哪些?
  12. python迅雷下载任务出错_迅雷下载任务出错的原因和解决方法 来研究下吧
  13. 图像处理——gamma矫正
  14. C++--struct的用法
  15. 手把手教你如何用python制作自动翻译程序
  16. 关于α测试与β测试的区别
  17. 【积水成渊-逐步定制自己的Emacs神器】3:为Emacs安装扩展
  18. 快速找到python第三方库
  19. 【Caffe细致入微】Solver_Step
  20. c#手写web内网网站映射,穿透服务器(一)

热门文章

  1. win10 dnf服务器未响应怎么办,手把手研习win10系统DNF游戏死机的具体教程
  2. Django Django文档
  3. 利用jsonp跨域访问
  4. 超能陆战队:迪士尼画风的漫威英雄
  5. 个人网站音乐服务器,自己的私人音乐流媒体服务,这才是多少音乐者的梦寐以求的...
  6. 苹果「Find My iPhone」立功,帮警察追踪偷车嫌犯
  7. 1212 无向图最小生成树
  8. advanced option里面没有resolution
  9. Go语言之interface详解
  10. 微星网卡linux驱动,微星b360系列win10无法安装网卡驱动解决方法_武汉久龙电脑维修中心...