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)
}

Go语言学习12-指针

Go语言学习12-指针

思考:panic错误

为什么下方这段代码有问题?因为此时的a虽然是指针类型,但是它是一个空指针,也就是a=nil,空指针没有指向一个内存地址。平时我们也不会这么写,但是要知道为什么存在问题。在Go语言中对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们的值就没办法存储。

那么怎么才能申请一个内存地址呢?new函数!

Go语言学习12-指针

var a *int
	*a = 100
	fmt.Println(*a)

总结

取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

  • 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
  • 指针变量的值是指针地址。
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

new函数申请内存地址

var a2 = new(int)	//分配一块内存并定义一个整数型指针

Go语言学习12-指针

make函数

make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。

等到map等类型学习,再详细说明。

make和new的区别

1、make和new都是用来申请内存

2、new很少用,一般用来给基本的数据类型申请内存,如intstring等,返回的是对应类型的指针。如new一个int,返回的就是一个int指针:*int

3、make是用来给slicemapchannel分配内存的,make函数返回的是对应的这三个类型本身。

上一篇:NOIP提高组模拟赛15


下一篇:2021/12/3文件上传-WAF绕过和修复