第 10 节:复合类型-5. 指针 -- 指针与指针变量
5. 指针 -- 不容易懂重点
01 指针定义和使用 -- 不容易懂重点
现在已经知道怎样获取变量在内存中的地址,但是如果想将获取的地址进行保存,应该怎样做呢?\
可以通过指针变量来存储,所谓的指针变量:就是用来存储任何一个值的内存地址。\
指针变量的定义如下:\
指针变量 p 的定义是通过 这个符号来定义,指针变量 p 的类型为 int, 表示存储的是一个整型变量的地址。\
如果指针变量 p 存储的是一个字符串类型变量的地址,那么指针变量 p 的类型为 * string\
p=&i : 该行代码的意思是,将变量 i 的地址取出来,并且赋值给指针变量 p. 也就是指针变量 p 指向了变量 i 的存储单元。\
可以通过如下图来表示:
在以上图中,一定要注意:指针变量 p 存储的是变量 i 的地址。
package main
import "fmt"
func main0301() {
var a int = 10
//fmt.Printf("%p\n", &a)
// 定义指针变量存储变量的地址
var p *int = &a
//fmt.Printf("%p\n", p)
//通过指针间接修改变量的值
//写操作
*p = 123
//fmt.Println(a)
//读操作
fmt.Println(*p)
}
func main0302() {
//声明指针变量 默认值为0x0 (nil)
//内存地址编号为0 0-255的空间为系统占用 不允许用户访问(读写)
//空指针
var p *int = nil
fmt.Println(p)
//new(数据类型) 开辟数据类型对应的内存空间 返回值为数据类型指针
//gc 垃圾回收机制
p = new(int)
*p = 123
fmt.Println(p)
fmt.Println(*p)
//fmt.Printf("%p\n", p)
//fmt.Println(*p)
//*p = 123
//
//fmt.Println(*p)
}
func main() {
//野指针 指针变量指向了一个未知空间 会报错
//var p *int = *int(0xc042058088)
//指针变量必须有一个合理的指向
//在程序中允许出现空指针 不允许出现野指针
//fmt.Println(*p)
}
2. 指针变量作为函数参数
package main
import "fmt"
//func swap(a, b int) {
// a, b = b, a
//}
//指针变量作为函数参数
func swap(a *int, b *int) {
//fmt.Println(*a)
//fmt.Println(*b)
//&变量 取地址操作 引用运算符
//*指针变量 取值操作 解引用运算符
//temp := *a
//
//fmt.Printf("temp类型:%T\n", temp)
//*a = *b
//*b = temp
*a, *b = *b, *a
}
func main() {
//a := 10.9 //float64
////通过自动推到类型创建指针变量
////所有的指针类型都存储的是一个无符号十六进制整型数据
//p := &a //*float64
////*int 类型
//fmt.Printf("%T\n", p)
//fmt.Println(p)
a := 10 //int
b := 20
//值传递
//swap(a, b)
//地址传递 形参可以改变实参的值
swap(&a, &b)
fmt.Println(a, b)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接