前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang数据类型之指针

Golang数据类型之指针

作者头像
仙人技术
发布2021-08-31 16:40:17
1K0
发布2021-08-31 16:40:17
举报
文章被收录于专栏:山山仙人的专栏

1、概述

每个变量在内存中都有对应的存储位置,也就是内存地址

指针类型是指变量存储的是一个内存地址的变量类型,在golang中可以通过&运算符获取变量的指针

取变量指针的语法

代码语言:javascript
复制
ptr := &v    // v的类型为T
// v:代表被取地址的变量,类型为T
// ptr:用于接收地址的变量,ptr的类型就为*T,称做T的指针类型。*代表指针

2、声明

指针声明需要指定存储地址中对应数据的类型,并使用*作为类型前缀进行指针取值

代码语言:javascript
复制
func main() {
    //指针取值
    a := 10
    b := &a // 取变量a的地址,将指针保存到b中
    fmt.Printf("type of b:%T\n", b)
    c := *b // 指针取值(根据指针去内存取值)
    fmt.Printf("type of c:%T\n", c)
    fmt.Printf("value of c:%v\n", c)
}
/*
type of b:*int
type of c:int
value of c:10
/*

用法归纳

  • 对变量进行取地址(&)操作,可以获得这个变量的指针变量
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值
  • 指针变量的值是变量的内存地址

3、空指针

指针变量声明后会被初始化为nil,表示的是空指针

代码语言:javascript
复制
func main() {
    var p *string
    fmt.Println(p)
    fmt.Printf("p的值是%v\n", p)
    if p != nil {
        fmt.Println("非空")
    } else {
        fmt.Println("空值")
    }
}

还可以使用new函数进行初始化,new函数会根据数据类型申请内存空间并使用零值填充,并返回申请的空间地址

代码语言:javascript
复制
var a *int = new(int)
fmt.Println(&a)
fmt.Println(a) // 0xc000014330
fmt.Println(*a) // 0
// 变量的地址 指针的地址 指针的值

4、用指针修改值

exchange函数依次进行的操作:

  • c指针的值, 赋给临时变量t
  • d指针的值, 赋给c指针指向的变量
  • c指针的值赋给d指针指向的变量
代码语言:javascript
复制
func exchange(c, d *int) {
	t := *c
	*c = *d
	*d = t
}
func main() {
	a, b := 6, 8      // 准备两个变量, 赋值6和8
	exchange(&a, &b)  // 交换变量值
	fmt.Println(a, b) // 输出变量值
}
/*
8 6
*/

5、指针的指针

用来存储指针变量地址的变量叫做指针的指针

代码语言:javascript
复制
func main() {
   var a int
   var ptr *int
   var pptr **int
   a = 3000
   /* 指针 ptr 地址 */
   ptr = &a
   /* 指向指针 ptr 地址 */
   pptr = &ptr
   /* 获取 pptr 的值 */
   fmt.Printf("变量 a = %d\n", a )
   fmt.Printf("指针变量 *ptr = %d\n", *ptr )
   fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}
/*
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
/*

多维指针

代码语言:javascript
复制
func main() {
		var a ****int
    v := 10
    p1 := &v  // *int
    p2 := &p1 // **int
    p3 := &p2 // ***int
    a = &p3   //  ****int
    fmt.Println(v, p1, p2, p3, a, ****a) // 10 0xc000114168 0xc00011e028 0xc00011e030 0xc00011e038 10
}

See you ~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、概述
  • 2、声明
  • 3、空指针
  • 4、用指针修改值
  • 5、指针的指针
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档