当前位置:网站首页>【go语言入门笔记】12、指针
【go语言入门笔记】12、指针
2022-08-04 05:28:00 【不负卿@】
指针是一个代表着某个内存地址的值
说到指针,会让许多人“谈虎色变”,尤其对指针偏移、运算、转换都非常恐惧。
其实,指针是使C/C++语言有极高性能的根本,在操作大块数据和做偏移时方便又便捷。
C/C++中指针饱受诟病的根本原因是指针运算和内存释放。
C/C++语言中的裸指针可以自由偏移,甚至可以在某些情况下偏移进入操作系统核心区域。
我们的计算机操作系统经常需要更新、修复漏洞的本质,是为解决指针越界访问所导致的“缓冲区溢出”。
指针概念在Go语言中被拆分为两个核心概念:
- 类型指针:允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。
- 切片,由指向起始元素的原始指针、元素数量和容量组成。
受益于这样的约束和拆分,Go语言的指针类型变量拥有指针的高效访问,但又不会发生指针偏移,从而避免非法修改关键性数据问题。同时,垃圾回收也比较容易对不会发生偏移的指针进行检索和回收。
1 、认识指针地址、指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。
Go语言中使用&
操作符放在变量前面对变量进行“取地址”操作。
格式如下:p := &变量
例:
package main
import (
"fmt"
)
func main() {
a := "hello"
p := &a //用符号 & 取变量a的地址
fmt.Println(p)
}
运行结果:
注:
- 输出了变量a的内存地址
- 输出值在每次运行是不同的
- 在32位平台上,将是32位地址;64位平台上是64位地址。
2、 从指针获取指针指向的值
在对普通变量使用&
操作符取地址获得这个变量的指针后
可以对指针使用*
操作,也就是指针取值
例:
package main
import (
"fmt"
)
func main() {
a := "hello"
p := &a
fmt.Println(p) //输出a的地址,p指针变量
fmt.Println(*p) //输出a的地址存储的值
}
运行结果:
3、使用指针修改值
package main
import (
"fmt"
)
func main() {
a := "hello" //变量a
p := &a //p指向a变量地址
b := "hello world" //变量b
*p = b //修改指针p指向的内存内容变
fmt.Println(a) //输出a的地址存储的值
}
运行结果:
4、new()函数创建指针
语法:指针变量 := new(数据类型)
例:
package main
import (
"fmt"
)
func main() {
c := new(string)
*c = "hello world"
fmt.Println(*c)
}
运行结果:
边栏推荐
猜你喜欢
随机推荐
程序、进程、线程、协程的概念及区别
浏览器中的同源策略
Commons Collections1
SQL练习 2022/7/3
(五)栈及其应用
MySQL最左前缀原则【我看懂了hh】
Shell(2)数值运算与判断
IP地址查询
攻防世界MISC—MISCall
yolov3数据读入(二)
yolov3中数据读入(一)
NFT市场以及如何打造一个NFT市场
flink-sql所有表连接器
编程Go:return、break、continue
flink on yarn指定第三方jar包
关于 for in与for of 的差别以及如何使用
MySql的concat和group_concat的区别
(十)树的基础部分(二)
关系型数据库-MySQL:多实例配置
android基础 [超级详细android存储方式解析(SharedPreferences,SQLite数据库存储)]