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 */

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大前端_Web

javascript事件监听中传递匿名函数(嵌套定义的命名函数)与命名函数的区别

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

13240
来自专栏枕边书

PHP正则中的捕获组与非捕获组

今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关...

20190
来自专栏HTML5学堂

JavaScript中的this详解

HTML5学堂:this属于JS的底层知识,了解this之后,能够实现一些基本的功能,但是感觉最重要的是,this是面向对象必不可少的组成部分,如果希望能够逐渐...

29340
来自专栏Java成长之路

动态代理详解

代理 是常用的基本设计模式之一,在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户...

9510
来自专栏极客编程

ECMAScript 6教程 (三) Class和Module(类和模块)

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文连接,博客地址为 http://www.cnblogs.co...

10530
来自专栏我的博客

加强版正则表达式

以前觉得正则表达很难,今天又加强了一下正则表达的学习收获挺大的 在书写正则表达式的过程中我们遇到数字就用 最近在学习原生js,所有例子都在js下测试 常见案例一...

40590
来自专栏企鹅号快讯

Python中的while循环

原创第13篇~while循环 阅读本文大概15分钟。 文章‍结构: while定义 普通while练习 while和input函数 while 和 else w...

45760
来自专栏数据结构与算法

P2085 最小函数值(minval)

题目描述 有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Aix^2+Bix+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数...

33850
来自专栏Linux驱动

25.C++- 泛型编程之函数模板(详解)

本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数和函数模板 ---- 当我们想写个Swap()交换函数时,通常这样写: voi...

29740
来自专栏前端迷

在循环内使用闭包(Closures)

闭包的本质是一个内部函数访问其作用域之外的变量。闭包可以用于实现诸如 私有变量 和 创建工厂函数之类的东西。

10320

扫码关注云+社区

领取腾讯云代金券