美文网首页golang
Go语言学习笔记10.复合类型-指针

Go语言学习笔记10.复合类型-指针

作者: 快乐的提千万 | 来源:发表于2019-11-05 16:45 被阅读0次

复合类型包括:

pointer 指针
array 数组
slice 切片
map 字典
struct 结构体

指针

和C一样,操作符 "&" 取变量地址, "*" 通过指针访问目标对象。
不同的是:

  • 默认值 nil,没有 NULL 常量
  • 不支持指针运算,不支持 "->" 运算符,直接⽤ "." 访问目标成员

如果将计算的内存看成一排别墅,每个别墅里面只装0或者1,一个int型数据需要8栋别墅,但是我告诉别人我的地址是0001-0008,只需要说从0001开始,后面8套都是我的。这个0001就叫首地址。取变量地址也就是首地址。而别墅里面的内容就叫目标对象。

package main //必须有个main包

import "fmt"

func main() {
    var a int = 10
    //每个变量有2层含义:变量的内存,变量的地址
    fmt.Printf("a = %d\n", a) //内存中存放的东西,也就是别墅里面的0或者1。
    fmt.Printf("&a = %v\n", &a) //内存的首地址,也就是0001。

    /*输出
        a = 10
        &a = 0xc000010080
    */

    //现在需要存储这个地址,指针就是专门存放这种地址的。
    var p *int //定义指针类型变量,int型的数据就要用*int 为什么?因为要告诉后面8套都是我的。这个8是根据类型来的。
    p = &a //把a的地址赋值给p
    fmt.Printf("p = %v, &a = %v\n", p, &a)//p = 0xc000010080, &a = 0xc000010080

    //再来改p里面的数据,会直接改动a
    *p = 666 //*p操作的不是p的内存,是p所指向的内存(就是a)
    fmt.Printf("*p = %v, a = %v\n", *p, a)//*p = 666, a = 666
    
    //既然P是一个变量,那么它也肯定有地址存储
    fmt.Printf("&p = %v\n", &p)

    //再把这个地址用指针存储起来,需要再加一个*
    var p2 **int  
    p2 = &p
    fmt.Printf("&p = %v\n", p2)
}

野指针和new

如果我说0001是我的首地址,但是其实这个位置有人了,这样会导致改变他人的数据。
如果我说0000是我的首地址,但是这个地址都不存在,或者是不可用的地址,那我就是野指针。
比如:

package main 

import "fmt"

func main() {
    var p *int
    p = nil
    fmt.Println("p = ", p)//p =  <nil>

    //*p = 666 //err, 因为p没有合法指向
}

那么我就是想先买8套别墅,还没想好要放什么怎么办,用new

    q := new(int) 
    *q = 777  //可以自由放数据进去
    fmt.Println("*q = ", *q)

这里有人可能会联想到其他语言的new或者malloc,是不是在堆区申请的?Go的变量具体在堆还是栈,是有个逃逸分析的,编译器会判断你适合在堆还是栈,后面有机会再详细说。

指针做函数参数

没啥特别的,指针也是变量,值得注意的是,操作指针指向别墅内的东西,会直接生效。专业点叫值传递也引用传递,前者是拷贝了一份,不影响原值。引用传递就是传递的地址,等于原值的地址都给你了,修改后原值会变。

package main 

import "fmt"

func swap(p1, p2 *int) {
    *p1, *p2 = *p2, *p1
}

func main() {
    a, b := 10, 20

    //通过一个函数交换a和b的内容
    swap(&a, &b) //地址传递
    fmt.Printf("main: a = %d, b = %d\n", a, b)
}

待补充

指针的用法说简单也简单,说难也难,可以说是C里面最复杂也最厉害的部分,后面遇到好的案例再补充。

相关文章

  • Go语言学习笔记10.复合类型-指针

    复合类型包括: pointer 指针array 数组slice 切片map 字典struct 结构体 指针 和C...

  • <>

    第六章重点: go语言数据类型:基础类型(数字,字符串,布尔类型),复合类型(数组,结构体),引用类型(指针,切片...

  • go语言指针类型的使用

    go语言的指针类型 简单地说go语言的指针类型和C/C++的指针类型用法是一样的,除了出去安全性的考虑,go语言增...

  • 笨办法学golang(三)

    这是Go语言学习笔记第三篇。 Go语言学习笔记参考书籍「Go语言圣经」以及Go官方标准库 Go语言基本类型主要有布...

  • go语言值传递与指针传递

    go语言指针 go语言作为静态编译型语言,具有指针类型,但是不提供对指针的移位危险操作,防止指针的越界等问题。 g...

  • Go语言探索 - 4(原创)

    Go语言基础系列博客用到的所有示例代码 在上一篇文章中,主要学习了Go语言的变量、指针、指针变量、常量以及类型转换...

  • 《GO语言圣经》读书笔记 第三章 基础数据类型

    Go语言将数据类型分为四类:** 基础类型、复合类型、引用类型和接口类型 ** 整型 Go语言的数值类型包括几种不...

  • Go核心语言编程 - 复合数据类型(3)

    Go对应的复合数据类型有数组,字典,指针,切片,通道,结构和结构,他们字面类型如下: • 指针 • 数组• 数组初...

  • (十四)golang unsafe.Pointer

    golang 的指针Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确...

  • golang实战笔记

    golang实战笔记 一、集合类型 1.值指针和引用类型a、go语言变量持有相应的值,列外:通道、函数、方法、映射...

网友评论

    本文标题:Go语言学习笔记10.复合类型-指针

    本文链接:https://www.haomeiwen.com/subject/ilkebctx.html