变量是存储值得地方。 借助声明变量时使用的名字来区分。

指针的值是一个变量的地址。一个指针指示值所保存的位置。不是所有的值都有地址,但是所有的变量都有。使用指针,可以在无需知道变量名字的情况下,间接读取或者更新变量的值。

Go语言支持指针类型*T,指针的指针**T。

指针声明

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

如果一个变量声明为 var x int:

  &x 获取一个指向整型变量的指针,它的类型是整形指针 *int;

  如果 p := &x,那么p指向x,p执行的变量写成*p;

  *p 表示获取变量的值,是一个整型,如果*p出现在赋值操作左边,则用于更新变量的值。

package main

import "fmt"

func incr(p *int) int {
*p++
fmt.Printf("value type: %T\n", *p)
return *p //p是一个整型指针,*p代表指针所指向的值
}
func main() {
v := 1
incr(&v) // &v 是1所在的地址
fmt.Println(&v) //打印2的地址,结果为 0xc420084008
fmt.Println(incr(&v)) //现在v的值为3 }

  

  

 从指针获取指针指向的值

正如上面所说,x 是一个普通变量,&x 获取一个指向整型变量的指针,它的类型是整形指针 *int,在对指针使用*操作,也就是指针取值

package main
import (
"fmt"
)
func main() {
// 准备一个字符串类型
var description = "This is the pointer example 001"
// 对字符串取地址, pointer类型为*string
pointer := &description
// 打印pointer的类型
fmt.Printf("pointer type: %T\n", pointer)
// 打印pointer的指针地址
fmt.Printf("address: %p\n", pointer)
// 对指针进行取值操作
value := *pointer
// 取值后的类型
fmt.Printf("value type: %T\n", value)
// 指针取值后就是指向变量的值
fmt.Printf("value: %s\n", value)
}

  

运行结果如下:

pointer type: *string
address: 0xc0000101e0
value type: string
value: This is the pointer example 001

使用指针修改值

在这个例子中,我们将a指向255的地址,然后通过*a取值并加一,可以看到新值已经加1.

package main

import (
"fmt"
) func main() {
b := 255
a := &b
fmt.Println("address of b is", a)
fmt.Println("value of b is", *a)
*a++
fmt.Println("new value of b is", b)
}

  

输出:

address of b is 0xc0000a2000
value of b is 255
new value of b is 256

空指针

当一个指针被定义后没有分配到任何变量时,它的值为 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")
}
}

  

结果如下:

ip == nil
sp == nil

请注意:定义的不同类型的零值不能用于比较运算

  

Go 指针的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. WAMP中mysql服务突然无法启动 解决方法

    wamp的mysql服务前两天还能用,今天突然不能无法启动了,原因可能是近期电脑强行关机,删除wamp\bin\mysql\mysql5.6.17\data目录下的ib_logfile0和ib_log ...

  2. Rhel6.5 相关操作

    Rhel 将光盘挂载动作 操作部分1 挂载光盘 https://jingyan.baidu.com/article/e52e3615a9c19440c60c5121.html ls -l /dev | ...

  3. linux安装mysql8.0及开启远程访问

    第一步:获取mysql8.0的yum源 进入mysql官网获取RPM包下载地址 https://dev.mysql.com/downloads/repo/yum/     点击下载后, 右键复制链接地 ...

  4. c#+cad2010+MQ接收消息

    cad2015+版本可以使用TrayItem气泡显示消息 static TrayItem trayItem = new TrayItem(); public static void testtrayi ...

  5. Shiro简介——《跟我学Shiro》

    地址: http://jinnianshilongnian.iteye.com/blog/2018936

  6. Verilog风格

    Verilog HDL编写原则: 可移植性强(多用宏定义:少用嵌入代码中的常数,即Magic Number:使用头文件): 必要的注释,代码易读: 模块间耦合尽可能低: 变量名与宏的命名规则: 变量名 ...

  7. Windows下搭建Python虚拟环境

    一.安装使用 virtualenv 1. 安装 virtualenv pip install virtualenv 2. 新建虚拟环境 virtualenv env1 用 Python3 创建虚拟环境 ...

  8. mac更新node,npm版本

    最近开发发现node版本多低的提示,于是升级一下 # 清除node.js的cache: $ sudo npm cache clean -f # 安装 n 工具,专门用来管理node.js版本的工具 $ ...

  9. Python爬虫的步骤和工具

    #四个步骤 1.查看crawl内容的源码格式          crawl的内容可以是 url(链接),文字,图片,视频 2.请求网页源码 (可能要设置)代理,限速,cookie 3.匹配 用正则表达 ...

  10. springboot学习一:快速搭建springboot项目

    1.idea创建springboot工程 JDK选择1.8以上的版本 选择springboot的版本和添加配置项 新建一个HelloController,测试 访问 http://localhost: ...