Go语言指针 | 青训营笔记

154 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

一、本堂课重点内容

本堂课的知识要点有哪些?

  • Go语言指针

二、详细知识点介绍

本堂课介绍了哪些知识点?

Go语言指针

  1. 我们可以专门定义一种数据类型来表示内存地址,这种数据类型的变量就称为地址变量,任何其它数据类型变量的地址都可以赋值给这类地址变量。在Go语言中这种专门用来表示地址的变量就称为“指针”。

  2. Go语言中专门有一个取地址操作符&,只要把取地址操作符放在变量名前面就可以了。格式为:&变量名

  3. 需要强调的是,变量的地址是该变量在内存中的首字节地址。对于byte类型的两个变量,其地址编号是连续的。而对于两个int64型的变量来说,其地址就不是连续的了。因为每个变量需要占8个字节,两个变量的地址之差就为8。

  4. 指针变量也和普通变量一样,须先声明后使用。Go语言的指针变量采用以下方式声明:

    var 指针名称 *数据类型
    
  5. 如果指针变量声明的时候没有赋值,则编译系统会给一个默认初始值,指针变量的默认初始值为空,即为nilnil指针不指向任何位置,随时可以被赋值。大多数的情况下,指针都是在声明的同时就赋值。如:

    var x int = 10
    var p *int = &x
    
  6. Go语言不支持指针运算,与C语言差别很大,使用的时候一定要注意。

  7. Go语言的指针也不支持字符串及切片的索引运算。

  8. 指向数组的指针索引是支持的,也就是说,如果指针p是指向数组array的,则array[10]p[10]是等价的。

  9. 可以用指针来代替数组,这样传入函数的仅仅是一个指针,也就几个字节,代价很低。在函数内部完全可以用指针来引用数组元素,效果一样。而且还有一个好处,可以实现函数的多返回值。

  10. 在Go语言中,字符串也是按值传递的,按值传递就会导致字符串复制副本传入函数。因而,对于大字符串来说,也是很浪费内存资源的,使用指针就可以节省很多内存资源。

  11. 在Go语言中结构体也是采用值传递的,很显然,大型结构体的副本也会占用系统较大的资源。为此,可以用指向结构体的指针来代替结构体,作为实参传入函数,这样就可以在函数中通过指针直接操作结构体字段。需要注意的是,直接操作结构体字段是有副作用的,操作的结果会影响原值。

  12. 直接指向数据变量的指针称为一级指针,指向一级指针的指针称为二级指针,指向二级指针的指针称为三级指针,以此类推,可以出现更多级指针。

  13. 只有同级指针才可以相互赋值,不同级别的指针是不能相互赋值的。

三、引用参考

我参考了哪些外部博客/笔记/文章?