指针简介

(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. Laravel 5.4 实现无限级分类

    最近在工作中遇到一个需求,是要在laravel 5.4中实现无限级分类,但发现网上这个的资料较少,所以只能自己来实现了,下面这篇文章主要给大家介绍了关于在laravel 5.4中实现无限级分类的方法示 ...

  2. C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法

    本文主要是实现操作系统级别的多进程间线程同步(进程同步)的示例代码及测试结果.代码经过测试,可供参考,也可直接使用. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同 ...

  3. 如何在centos环境下搭建java环境

    在CentOS上安装Java环境:[1]使用yum安装java 现阶段做企业级项目开发一般都采用Java语言.开发的项目需要放在服务器上运行测试,若以CentOS系统为服务器系统,首先要解决就是Cen ...

  4. 团队-Forward-团队一阶段互评

    学号:2015035107105得分:4原因:代码不规范,有一些错误,需要我们的帮助. 学号:2015035107109得分:7原因:与队员沟通少,代码衔接有问题. 学号:2015035107113得 ...

  5. ZOJ3704 I am Nexus Master! 2017-04-06 23:36 56人阅读 评论(0) 收藏

    I am Nexus Master! Time Limit: 2 Seconds      Memory Limit: 65536 KB NexusHD.org is a popular PT (Pr ...

  6. AndroidStudio-Unable to save settings Failed to save settings. Please restart Android Studio

    Unable to save settings Failed to save settings. Please restart Android Studio 解决方法: 删除工程的.idea 然后在 ...

  7. DateUtils常用方法

    一.DateUtils常用方法   1.1.常用的日期判断 isSameDay(final Date date1, final Date date2):判断两个时间是否是同一天: isSameInst ...

  8. Oracle索引技术研究

    Oracle索引类型 B树索引 特定类型索引 确定索引列 主键和唯一键值列的索引 外键索引 其他合适的索引列 B树索引 B树索引算法 B树是指B-tree(Balanced Tree),B树的存在是为 ...

  9. VUE 学习笔记 一 指令

    1.声明式渲染 v-bind 特性被称为指令.指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性 <div id='app'> <span v-bind:title=" ...

  10. 浅析Object基类提供的Equals方法

    当我们去查看object.cs源代码文件的时候,会发现object基类提供了三种判断相等性的方法.弄清楚每种方法存在的原因,也就是具体解决了什么问题,对我们理解.net判断对象相等性的逻辑很有帮助,下 ...