指针简介

(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。一个指针变量指向了一个值的内存地址。

Go语言支持指针类型*T,指针的指针**T,以及包含包名前缀的*package.T

指针声明

在指针类型变量前面加上 *(取值符)来获取指针所指向的内容。
在值类型变量前面加上 &(取地址符)来获取该变量的指针。

声明一个int值的指针变量

var ip *int

声明一个string值的指针变量

var sp *string

通过 := 语法来定义指针

var str string = "春生"
sp := &str

声明一个int值的指针的指针变量

var p **int

声明一个time.Time值的指针变量

var t *time.Time

打印变量在内存中的地址:

package main

import "fmt"

func main() {
var str string = "oldboy" fmt.Printf("变量的地址: %x\n", &str)
}

运行结果:

变量的地址: c42000e1d0

空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。

nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。

package main

import (
"fmt"
) func main() {
var ip *int
var sp *string if ip == nil {
fmt.Println("ip == nil")
}
if sp == nil {
fmt.Println("sp == nil")
}
}

定义的不同类型的零值不能用于比较运算,实例如下:

package main

import (
"fmt"
) func main() {
var ip *int
var sp *string if ip == sp {
fmt.Println("error")
}
}

编译错误:

./main.go::: invalid operation: ip == sp (mismatched types *int and *string)

查看零值指针类型,实例如下:

package main

import (
"fmt"
) func main() {
var ip *int
var sp *string fmt.Printf("ip : %#v\n", ip)
fmt.Printf("sp : %#v\n", sp)
}

运行结果:

ip : (*int)(nil)
sp : (*string)(nil)

指针类型转换

Go语言是不允许两个指针类型进行转换的。

我们一般使用T作为一个指针类型,表示一个指向类型T变量的指针。为了安全的考虑,两个不同的指针类型不能相互转换,比如 *uint 不能转为 *int 。实例如下:

package main

func main() {
var i uint =
var p2 *int p1 := &i
p2 = (*int)(p1)
}

编译错误:

./main.go::: cannot convert p1 (type *uint) to type *int

unsafe.Pointer类型用于表示任意类型的指针。有4个特殊的只能用于Pointer类型的操作:

1、 任意类型的指针可以转换为一个Pointer类型值
2、 一个Pointer类型值可以转换为任意类型的指针
3、 一个uintptr类型值可以转换为一个Pointer类型值
4、 一个Pointer类型值可以转换为一个uintptr类型值

因此,Pointer类型允许程序绕过类型系统读写任意内存。使用它时必须谨慎。实例如下:

package main

import (
"fmt"
"unsafe"
) func main() {
var i uint =
var p2 *int p1 := &i
p2 = (*int)(unsafe.Pointer(p1))
fmt.Println(*p2)
}

Go语言指针的更多相关文章

  1. C语言指针转换为intptr_t类型

    1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...

  2. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  3. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  4. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  5. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  6. 关于C语言指针的问题

    在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  7. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  8. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  9. C语言指针操作

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...

  10. C语言指针声明探秘

    C语言指针声明探秘

随机推荐

  1. Levenshtein计算相似度距离

    使用Levenshtein计算相似度距离,装下模块,调用下函数就好. 拿idf还得自己去算权重,而且不一定准确度高,一般做idf还得做词性归一化,把动词形容词什么全部转成名词,很麻烦. Levensh ...

  2. http头部信息

    1.常见的返回码 100: 请服务器端继续返回 200:成功 301:永久重定向 存的地址永久的改变了  301 302 : 暂时重定向 302仍然使用老得url 401 : 无法找到资源file n ...

  3. mysql5.7文件无法导入数据库的解决方案

    一般是因为my.ini的“secure-file-priv”的设置导致loaddata失败,网上查了许多资料,大部分都是要求注释掉my.ini的: secure-file-priv="C:/ ...

  4. C#多边形求角——实例说

    前段时间有写过一个计算多边形角度的代码,这里给它整理整理,留给自己也送给萌新. 看左下图,这是一个多环的多边形,一个外环(内部为多边形内部区域),一个内环(外部为多边形内部区域),同时多边形中任意一个 ...

  5. MVC中用jQuery加BootStrap实现动态增加删除文本输入框!

    http://www.freejs.net/article_biaodan_278.html 这是在网上找到方法,我修改了一下实合我的项目,发博只为收藏记录并加深记忆. 修改后效果如下 @model ...

  6. 使用ssm实现校验密码

    由于审题不清,在完成作业“servlet实现进行用户名和密码验证”中使用了jdbc连接数据库的方式实现,没用静态方式验证,故本次作业使用ssm实现 本次作业上传到百度网盘:链接:https://pan ...

  7. BootStrap框架引入文件

    bootstrap -- 框架 引入需要的  这是外网的------************************************************************* < ...

  8. vue 中的computed和watch

    计算属性 通过计算得来的属性 computed:是一个计算属性,用来监听属性的变化 computed里面的方法调用的时候是不需要加() 另外里面的方法必须要有一个返回值   computed里面的方法 ...

  9. Mac上使用oh-my-zsh+iterm2

    一.安装oh-my-zsh插件 1.1 下载 git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh 1.2创建新配置 如 ...

  10. JAVA构造函数(方法)

    一.什么是构造函数 java构造函数,也叫构造方法,是java中一种特殊的函数.函数名与相同,无返回值. 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法. 在现 ...