Go的指针
指针
指针是一种存储变量内存地址(Memory Address)的变量。
1 取一个变量的地址:& 取地址符号
2 在非指针类型前面加*,表示指向这个类型的指针
3 在指针变量前加*,表示解引用(反解),取该指针指向的值
一、指针的声明
var a = 10
// 取地址,生成指针
var pointer = &a
fmt.Println(pointer) // 0xc00000a0c8
// 指针类型为 *+普通类型
fmt.Printf("%T",pointer) // *int
二、指针的默认值(Zero Value)
是 nil。
因为指针也是引用类型。
var b *int
fmt.Println(b)
// <nil>
三、指针的解引用
在指针变量前加*,表示解引用(反解),取该指针指向的值。
var a = 10
var pointer = &a
// 解引用
fmt.Println(*pointer) // 10
四、向函数传递指针参数
1、非 数组/切片 指针传参
var b =156
fmt.Println(b) // 156
f1(&b) // 100
fmt.Println(b) // 100
func f1(x *int) {
*x=100
fmt.Println(*x) // 100
}
2、数组/切片 指针传参
不推荐向函数传递数组的指针,而应该使用切片。
因为切片的长度是不固定的,可以随意变化其引用的数组的长度;而如果是数组的指针,那长度就是固定的,无法变换类型了。
var c =[3]int{1,2,3}
fmt.Println(c) // [1 2 3]
f3(c[:])
fmt.Println(c) // [100 2 3]
func f3(x []int) {
x[0]=100
fmt.Println(x) // [100 2 3]
}
// 不过硬要传数组的指针也可以
var c =[3]int{1,2,3}
fmt.Println(c) // [1 2 3]
f2(&c)
fmt.Println(c) // [100 2 3]
func f2(x *[3]int) {
x[0]=100 //支持指针直接操作,自动反解,自动解引用
//(*x)[1] = 222 //正统写法
fmt.Println(*x) // [100 2 3]
fmt.Println(x) // &[100 2 3] //指向数组的指针,就这样
}
五、Go不支持指针运算
Go 并不支持其他语言(例如 C)中的指针运算。
b := [...]int{109, 110, 111}
p := &b
p++
上面的程序会抛出编译错误:main.go:6: invalid operation: p++ (non-numeric type \*[3]int)。
Go的指针的更多相关文章
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- enote笔记法使用范例(2)——指针(1)智能指针
要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...
- C++虚函数和函数指针一起使用
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...
- C++11 shared_ptr 智能指针 的使用,避免内存泄露
多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...
- c 数组与指针的使用注意事项
数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
- C++智能指针
引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...
- EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针
一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...
- 智能指针shared_ptr的用法
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
随机推荐
- Flink-v1.12官方网站翻译-P002-Fraud Detection with the DataStream API
使用DataStream API进行欺诈检测 Apache Flink提供了一个DataStream API,用于构建强大的.有状态的流式应用.它提供了对状态和时间的精细控制,这使得高级事件驱动系统的 ...
- OpenCV4.4.0 安装测试 Installation & Examination (Ubuntu18.04, Ubuntu 20.04)
OpenCV4.4.0 安装测试 Installation & Examination (Ubuntu18.04, Ubuntu 20.04) 单纯简单的 OpenCV 安装配置方法,在这个地 ...
- 从微信小程序到鸿蒙js开发【04】——list组件
目录: 1.可滚动区域 2.list + list-item 3.list + list-item-group + list-item 1.可滚动区域 在许多场景中,页面会有一块区域是可滚动的,比如这 ...
- MyBatis逆向工程生成dao层增删改查方法解释使用(转载)
int countByExample(BUserExample example); //根据条件查询数量 /** * 示例 * public int countByExample() { * BUse ...
- 牛客15334 Easygoing Single Tune Circulation(后缀自动机+字典树)
传送门:Easygoing Single Tune Circulation 题意 给定n个字符串 s[i],再给出m个查询的字符串 t[i],问 t[i] 是否为某个 s[i] 循环无限次的子串. 题 ...
- 【noi 2.6_9280】&【bzoj 1089】严格n元树(DP+高精度+重载运算符)
题意:定义一棵树的所有非叶节点都恰好有n个儿子为严格n元树.问深度为d的严格n元树数目. 解法:f[i]表示深度为<=i的严格n元树数目.f[i]-f[i-1]表示深度为i的严格n元树数目.f[ ...
- hdu 6806 Equal Sentences 找规律
题意: 给你一个有n个单词的单词串S,对这n个单词进行排列组合形成新的一个单词串T,如果在S中任意某个单词所在位置,和这个单词在T中所在位置之差的绝对值小于等于1,那么就说S和T串相等 让你求S一共有 ...
- Nacos学习与实战
1. 什么是Nacos 官网:https://nacos.io/zh-cn/index.html Nacos是阿里巴巴集团开源的项目,Nacos 致力于帮助您发现.配置和管理微服务. Nacos提供了 ...
- Cron表达式在 定时执行专家 5.0 中的使用方式
在<定时执行专家 V5.0>程序内部使用了包含 6 位的 Cron表达式,第一个字段(second)没有使用.程序内部一直 second 位是 0.在 Cron表达式的界面上可以设置 5位 ...
- 一句话木马的简单例子 网站webshell & 远程连接
一 概述 本地 kail linux 目标 windows nt 服务器 二 过程 首先编写一句话木马 index.php 一句话木马的原理就是把C=xxx 字符串当成php语句执行 注意这里用 ...