一、指针的相关概念说明
- 变量:是基本类型,变量存的就是值,也叫值类型
- 地址:用于引用计算机的内存地址,可理解为内存地址的标签,通俗一点讲就是一间房在小区里的门牌号。如下图①
- 指针:指针变量存的是一个地址,这个地址指向的空间存的才是值(表示地址的指向,指针是一个指向另一个变量内存地址的值)。如下图②
- &:取地址符,例如:{指针}:=&{变量}。如下图②
- * :取值符,例如:{变量}:=*{指针}。如下图②
图①
图②
二、指针的使用案例
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
案例一
package main import "fmt" func main() { var a int= 10 /* 声明实际变量 */ var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x ", &a ) /* 指针变量的存储地址 */ fmt.Printf("ip 变量的存储地址: %x ", ip ) /* 使用指针访问值 */ fmt.Printf("*ip 变量的值: %d ", *ip ) }
a变量的地址是:0xc042052058 ip变量的存储地址是0xc042052058 *ip变量的值是:10
案例二
package main import "fmt" // 我们用两个不同的例子来演示指针的用法 // zeroval函数有一个int类型参数,这个时候传递给函数的是变量的值 func zeroval(ival int) { ival = 0 } // zeroptr函数的参数是int类型指针,这个时候传递给函数的是变量的地址 // 在函数内部对这个地址所指向的变量的任何修改都会反映到原来的变量上。 func zeroptr(iptr *int) { *iptr = 0 } func main() { i := 1 fmt.Println("initial:", i) zeroval(i) fmt.Println("zeroval:", i) // &操作符用来取得i变量的地址 zeroptr(&i) fmt.Println("zeroptr:", i) // 指针类型也可以输出 fmt.Println("pointer:", &i) }
initial: 1 zeroval: 1 zeroptr: 0 pointer: 0xc042052058
空指针
package main import ( "fmt" ) func main(){ //下面一行代码注释就是空指针,那么值为0 var a int = 1 var ip *int = &a fmt.Printf("ip的值为:%x", ip) if (ip == nil) { fmt.Printf("是空指针") } else { fmt.Printf("非空指针") } }