一、基本介绍
-
基本数据类型:变量存的就是值,也叫做值类型。
-
获取变量的地址,用 & 符号。例如 var n int = 10 fmt.Println(&n) 输出 n 的地址。
- 指针类型:指针变量存储的是一个地址,这个地址指向的空间才是值。例如 var p *int = &n
- 获取指针类型指向的值,使用 * 符号。例如 fmt.Println(*p) 输出 p 指向的值,也就是 n 的值。
二、指针的使用细节
- 指针类型的零值是 nil,表示不指向任何地址。
- 指针不能进行算术运算,但可以比较是否相等。
- 指针可以指向任何类型的值,包括结构体、数组、函数等。(值类型都有对应的指针类型,形式为 *数据类型。例如 int 对应的是 *int, float64 对应的是 *float64)
- 基本数据类型 int、float64、bool、string;复合数据类型 struct、array、slice、map、channel 等。
- 值类型包括:int系列、float系列、bool、string、数组、结构体
三、代码示例
package main
import "fmt"
func main() {
var n int = 10
var p *int = &n
fmt.Println("n的值为:", n) // 10
fmt.Println("n的地址为:", &n) // n 的地址
fmt.Println("p的值为:", p) // n 的地址
fmt.Println("p指向的值为:", *p) // 10
fmt.Printf("p的类型为:%T\n", p) // *int
// 通过指针修改值
*p = 20
fmt.Println("修改后n的值为:", n) // 20
fmt.Println("修改后p指向的值为:", *p) // 20
// 指针的零值是 nil
var q *int
fmt.Println("q的值为:", q) // nil
// 指针不能进行算术运算,但可以比较是否相等
var r *int = &n
fmt.Println("p和r是否相等:", p == r) // true
// 值类型和指针类型要一一对应,不能混用
var s int = 30
var t *float64 = &s // 错误:cannot use &s (type *int) as type *float64 in assignment
}