zoukankan      html  css  js  c++  java
  • Golang 指针

    默认指针类型

    类型 名称 长度 默认值
    pointer 指针 nil
    array 数组 0
    slice 切片 nil
    map 字典 nil
    struct 结构体

    1. 变量和内存地址

    • go 语言中指针是很容易学习的,比 C 中容易的多,它可以更简单地执行一些任务
    • 每个变量都有内存地址,可以理解为变量来操作对应的内存
    • go 语言的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址
    package main
    
    import "fmt"
    
    func main() {
    	var a int
    	a = 0
    	// 使用 & 符号获取变量地址
    	fmt.Println(&a)
    	fmt.Printf("变量a的地址是: %x
    ", &a)
    }
    

    2. 值类型和指针类型

    • 普通变量存储的是对应类型的值,这些类型叫值类型(var a int = 10)
    • 指针也是一个变量,用于存储另一个变量的内存地址,变量存的是值,指针存的是一个地址,这个地址指向的空间存的才是值,所以指针又叫引用类型
    • 与变量类似,使用前需要声明
    • 声明指针的格式:var 指针变量名 *指针类型
    • 指针的使用
    package main
    
    import "fmt"
    
    func main() {
    	var a int
    	a = 10
    	var p *int
    	// 指针类型存变量地址
    	p = &a
    
    	fmt.Printf("变量a的地址: %x
    ", &a)
    	fmt.Printf("指针类型p指向a地址的值: %x
    ", p)
    	fmt.Printf("指针类型p获取指针变量的值: %d
    ", *p)
    }
    

    3. 空指针

    • 当一个指针被定义后没有分配到任何变量时,它的值为 nil
    • 空指针的判断
    package main
    
    import "fmt"
    
    func main() {
    	var p *int
    	fmt.Println(p)
    	fmt.Printf("p的值%x
    ", p)
    
    	// 判断类型是否为空
    	if p != nil {
    		fmt.Println("非空")
    	} else {
    		fmt.Println("空")
    	}
    }
    

    4. 值传递和引用传递

    package main
    
    import "fmt"
    
    func swap(a, b *int) {
    	// 交换语法,必须交换值
    	//a, b = b, a
    	*a, *b = *b, *a
    }
    
    func main() {
    	a, b := 10, 20
    	fmt.Println(a, b)
    	swap(&a, &b)
    	fmt.Println(a, b)
    }
    
    package main
    
    import "fmt"
    
    func swap(a, b *int) (*int, *int) {
    	a, b = b, a
    	return a, b
    }
    
    func main() {
    	a, b := 10, 20
    	fmt.Println(a, b)
    	c, d := swap(&a, &b)
    	fmt.Println(*c, *d)
    
    	fmt.Println(&a, &b)
    
    	// 这里可以打断点,导致连锁反应
    	a = *c
    	b = *d
    
    	fmt.Println(a, b)
    }
    

    5. new()和 make()

    • make()用来分配引用类型的内存,例如 slice、map、channel,并且初始化内存
    • new()用来分配各种类型的内存,但它不会初始化内存
    • make()的用途不同于 new(),它只能创建 slice、map、channel,并返回类型为 T(非指针)的已初始化(非零值)的值
    package main
    
    import "fmt"
    
    func main() {
    	a := new([]int)
    	fmt.Println(a)
    
    	b := make([]int, 10, 20)
    	fmt.Println(b)
    }
    // 输出结果
    // &[]
    // [0 0 0 0 0 0 0 0 0 0]
    
  • 相关阅读:
    27、驱动调试之修改系统时钟中断定位系统僵死问题
    25、驱动调试之打印到proc虚拟文件
    24、驱动调试之printk
    23、uevent/hotplug热拔插机制
    22、DMA驱动程序框架
    21、IIS声卡驱动程序
    20、RTC驱动程序
    ZOJ
    HDU-4272 LianLianKan (dfs)
    UVA-624 CD (01背包+路径记忆)
  • 原文地址:https://www.cnblogs.com/zhichaoma/p/12510011.html
Copyright © 2011-2022 走看看