昨日当年
你一双澄澈眼眸 便使我颠沛中毕生富有
Go语言入门学习(四)——指针

内存地址

在Go语言中,可以使用&符来表示一个变量在内存中的地址。比如

package main
import "fmt"
func main() {
   var a int = 10
   fmt.Printf("Address of a variable: %x\n", &a  )
}

执行上面的代码,就会输出变量 a 的内存地址

Address of a variable: c042052058

指针

指针是一个指向变量在内存中实际地址的对象。和其它变量一样,要先声明一个指针变量才能使用。

声明一个指针变量:

var var-name *var-type
  • var-type 是指针的基类型,它必须是Go的数据类型,例如 int , float32
  • var-name 是指针变量的名称

使用指针

可以在指针变量前加 * 输出其所存储的变量的值

package main
import "fmt"
func main() {
   var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */
   ip = &a  /* 将实际变量的存储地址赋给指针变量 */
   fmt.Printf("a 变量的地址是: %x\n", &a  )
   /* 指针变量存储的指针地址 */
   fmt.Printf("ip 变量储存的指针地址: %x\n", ip )
   /* 使用指针访问值 */
   fmt.Printf("*ip 变量的值: %d\n", *ip )
}

上面的代码执行的结果是:

a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20

nil指针

nil 是未分配地址的指针变量的值。
值为 nil 的指针变量被称为 nil 指针。

package main
import "fmt"
func main() {
   var  ptr *int
   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

上面的代码执行的结果是:

The value of ptr is 0

同时,可以使用 ptr == nil 来判断一个指针变量是否为 nil 指针。

引用传递

Go 语言允许向函数传递指针,只需要在函数定义的参数上设置为指针类型即可。向这种函数传递参数称为引用传递,引用传递在函数中进行的修改将影响到实际参数。

package main
import "fmt"
func main() {
   /* 定义局部变量 */
   var a int = 100
   var b int= 200
   fmt.Printf("交换前 a 的值 : %d\n", a )
   fmt.Printf("交换前 b 的值 : %d\n", b )
   /* 调用函数用于交换值
   * &a 指向 a 变量的地址
   * &b 指向 b 变量的地址
   */
   swap(&a, &b);
   fmt.Printf("交换后 a 的值 : %d\n", a )
   fmt.Printf("交换后 b 的值 : %d\n", b )
}
func swap(x *int, y *int) {
   var temp int
   temp = *x    /* 保存 x 地址的值 */
   *x = *y      /* 将 y 赋值给 x */
   *y = temp    /* 将 temp 赋值给 y */
}```
以上实例允许输出结果为:
```go
交换前 a 的值 : 100
交换前 b 的值 : 200
交换后 a 的值 : 200
交换后 b 的值 : 100

相关日志