GoLang:指针

学习自: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]

1
2
3
4
5
6
7
8
9
10
11
//①数组名:arr[i]
//②指针:(*p)[i]
//③指针:p[i]
 
var p *[3]int
var arr [3]int=[3]int{1,2,3}
p=&arr
<br>//三种方法
arr[2]
(*p)[2]
p[2]<br><br>//错误方式<br>*(p+1)<br>*(p++)

  

3、指向切片的指针

1)说明

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

2)定义与操作

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

访问其中某个值

①sce[i]

②(*p)[i]

 

4、指向字典的指针

1
2
3
4
5
dict :=map[string]string{"name":"lnj","age":"33"}
var p *map[string]string=&dict
 
//通过指针操作map元素
(*p)["name"]="zs"

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

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

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

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

 

posted @   ShineLe  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示