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

Golang语言--指针

作者头像
李海彬
发布2018-03-21 11:01:44
8290
发布2018-03-21 11:01:44
举报
文章被收录于专栏:Golang语言社区

在Go中指针是很容易学习的。一些进入编程任务,指针更容易操作,如通过引用调用,需要要使用指针来执行。所以学习指针成为完美Go程序员很有必要。让我们开始学习指针的简单和容易的步骤。

如你所知,每一个变量是一个内存位置,每个存储单元都有其定义的地址,可以用符号(&)运算符,它表示一个内存地址进行访问。考虑下面的例子,这将打印中定义的变量的地址。

package main

import "fmt"

func main() {

var a int = 10

fmt.Printf("Address of a variable: %x\n", &a )

}

当上述代码被编译和执行时,它会产生导致一些如下:

Address of a variable: 10328000

所以,明白了什么是内存地址以及如何访问它,所以这个概念的基础上。现在,让我们来看看什么是指针。

什么是指针?

指针是一个变量,其值是另一个变量的地址,所述存储器位置,即,直接地址。就像变量或常量,必须声明指针之前,可以用它来存储任何变量的地址。指针变量声明的一般形式是:

var var_name *var-type

在这里,type为指针的基本类型;它必须是一个有效的Go数据类型,var-name是指针变量的名称。 * 用来声明指针使用星号。然而,在该语句中的星号被用来指定一个变量作为一个指针。以下是有效的指针声明:

var ip *int /* pointer to an integer */

var fp *float32 /* pointer to a float */

所有指针值的实际数据类型,无论是整数,浮点或以其他方式,都是相同的,代表一存储器地址的长十六进制数。不同数据类型的指针之间的唯一区别是变量的数据类型或常数,由该指针指向。

如何使用指针?

有一些重要的操作,我们使用指针非常频繁。 (a)定义一个指针变量(b)分配一个变量的指针;(c)在指针变量的地址,可用地址来访问它的值。这可通过使用一元运算符 * ,返回位于其操作数所指定的地址的变量的值。下面的例子利用这些操作:

package main

import "fmt"

func main() {

var a int= 20 /* actual variable declaration */

var ip *int /* pointer variable declaration */

ip = &a /* store address of a in pointer variable*/

fmt.Printf("Address of a variable: %x\n", &a )

/* address stored in pointer variable */

fmt.Printf("Address stored in ip variable: %x\n", ip )

/* access the value using the pointer */

fmt.Printf("Value of *ip variable: %d\n", *ip )

}

当上述代码被编译和执行时,它会产生一些如下:

Address of var variable: 10328000

Address stored in ip variable: 10328000

Value of *ip variable: 20

在Go中的nil指针

Go语言编译一个 nil 值赋给一个没有被确切的地址分配的指针变量。这样做是在变量声明时,分配 nil 指针被称为nil指针。

nil指针是一个常数为零在几个标准库中定义的值。考虑下面的程序:

package main

import "fmt"

func main() {

var ptr *int

fmt.Printf("The value of ptr is : %x\n", ptr )

}

让我们编译和运行上面的程序,这将产生以下结果:

The value of ptr is 0

在大多数操作系统中,程序不允许访问存储器的0地址,因为该存储器是由操作系统保留。然而,存储器地址0具有特别重要的意义;它表明,该指针不指向一个访问的存储器位置。不过,按照惯例,如果一个指针包含nil(零)的值,则假定它指向一个什么。

要检查零(nil)指针,可以使用if语句如下:

if(ptr != nil) /* succeeds if p is not nil */

if(ptr == nil) /* succeeds if p is null */

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

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

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

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