GoLang:指针

ShineLee / 2023-08-22 / 原文

学习自:GoLang教程110页

1、普通指针

说明

指针变量用于存放其他变量的地址

无论指向什么类型的变量,指针的实际内存占用都是一样的:32位4B,64位8B:

var p1 *int;
var p2 *float64;
var p3*bool;

fmt.Println(unsafe.Sizeof(p1))//8
fmt.Println(unsafe.Sizeof(p2))//8
fmt.Println(unsafe.Sizeof(p3))//8

使用:*p

var num int = 666
var p *int = &num

//查看地址
fmt.Printf("%p\n",&num) //0xc0000180c0
fmt.Printf("%p\n",p) //0xc0000180c0
fmt.Printf("%T\n",p) //*int

//修改指向地址的内容
*p=888
fmt.Println(num)//888
fmt.Println(*p)//888

2、指向数组的指针

1)指向数组

在Go中,如果要获取数组的地址,有两种方式:&arr与&arr[0]

arr := [3]int{1,3,5}
fmt.Printf("%p\n",&arr)
fmt.Printf("%p\n",&arr[0])

//不能直接打印数组名
fmt.Printf("%p\n",arr)//错误

Go中,只有相同数据类型才能赋值,所以要将一个指针指向数组,只能这样写:&数组名

var arr [3]int = [3]int{1,3,5}

var p *[3]int //p类型是*[3]int
p=&arr


//以下两种错误写法,只有相同类型才能赋值
p=arr //arr是[3]int类型
p=&arr[0]//&arr[0]是*int类型

说明

不支持+1 -1 ++ --

2)操作数组的几种方式

①数组名:arr[i]

②指针:(*p)[i]

③指针:p[i]

//①数组名:arr[i]
//②指针:(*p)[i]
//③指针:p[i]

var p *[3]int
var arr [3]int=[3]int{1,2,3}
p=&arr

//三种方法 arr[2] (*p)[2] p[2]

//错误方式
*(p+1)
*(p++)

  

3、指向切片的指针

1)说明

切片的本质就是一个指向数组的指针,因此指向切片的指针是一个二级指针

2)定义与操作

var sce []int = []int{1,3,5} //sce的类型是[]int
var p *[]int                      //p的类型是*[]int  
p=&sce                          //p指向切片时也是用引用&

p             //&[1,3,5]
*p            //[1,3,5]

访问其中某个值

①sce[i]

②(*p)[i]

 

4、指向字典的指针

dict :=map[string]string{"name":"lnj","age":"33"}
var p *map[string]string=&dict

//通过指针操作map元素
(*p)["name"]="zs"

5、指针作为函数参数和返回值

指针作为参数时,此时函数内外是引用传递——对形参的修改会影响实参

不能将函数内部定义的指向局部变量的指针进行返回,这样在函数结束时空间会被释放

可以将局部变量作为返回值,本质是拷贝一份。