Go语言学习12-指针
任何程序数据载入内存后,在内存都有他们的地址,这就是指针。而为了保存一个数据在内存中的地址,我们就需要指针变量。
Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,我们只需要记住两个符号:&
(取地址)和*
(根据地址取值)。
C语言为什么运行快?就是涉及到了指针的偏移和运算,允许程序员在内存上乱划拉。但是容易出现内存溢出!还有内存释放等。
指针地址和指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&
字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int
、*int64
、*string
等。
取变量指针的语法如下:
ptr := &v // v的类型为T
其中:
- v:代表被取地址的变量,类型为
T
- ptr:用于接收地址的变量,ptr的类型就为
*T
,称做T的指针类型。*代表指针。
举个例子:
func main() {
a := 10
b := &a
fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078
fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int
fmt.Println(&b) // 0xc00000e018
}
package main
import "fmt"
func main() {
s := 18
p := &s //取出s的内存地址
m := *p //取出
fmt.Printf("取p的值:%d,并且m的数据类型为:%T\n", m, m)
fmt.Printf("p的数据类型为:%T\n", p)
}
思考:panic错误
为什么下方这段代码有问题?因为此时的a虽然是指针类型,但是它是一个空指针,也就是a=nil
,空指针没有指向一个内存地址。平时我们也不会这么写,但是要知道为什么存在问题。在Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们的值就没办法存储。
那么怎么才能申请一个内存地址呢?new函数!
var a *int
*a = 100
fmt.Println(*a)
总结
取地址操作符&
和取值操作符*
是一对互补操作符,&
取出地址,*
根据地址取出地址指向的值。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
- 指针变量的值是指针地址。
- 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。
new函数申请内存地址
var a2 = new(int) //分配一块内存并定义一个整数型指针
make函数
make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。
等到map等类型学习,再详细说明。
make和new的区别
1、make和new都是用来申请内存的
2、new很少用,一般用来给基本的数据类型申请内存,如int
、string
等,返回的是对应类型的指针。如new一个int
,返回的就是一个int
指针:*int
。
3、make是用来给slice
、map
、channel
分配内存的,make函数返回的是对应的这三个类型本身。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!