指针类型
大约 1 分钟
指针类型
Go里没有像C那样的指针运算,只有一些简单的操作,比较简单
基本使用 (定义、赋值、使用)
package main
import(
"fmt"
)
func main() {
// 地址的定义、赋值、使用、转换 (取地址、地址转值)
var age int = 18
var ptr *int = &age // `&变量`,就可以获取变量对应的地址
fmt.Println(&age) // 0xc0000a2058, age变量的地址
fmt.Println(ptr) // 0xc0000a2058, ptr变量的值
fmt.Println(&ptr) // 0xc000006030, ptr变量的地址
fmt.Println(age) // 18, age变量的值
fmt.Println(*ptr) // 18, "ptr变量的值 所对应的地址的值"
age = 20 // 修改 age变量的值
*prt = 20 // 修改 "ptr变量的值 所对应的地址的值"。效果等同于上一行
ptr = 0
}
一些特性
一些废话 (其他语言基本都是这样)
- 可以通过指针改变指向值
- 类型检查
- 指针变量接收的一定是地址值
- 指针变量的地址不可以不匹配
- 基本数据类型 (又叫值类型),都有对应的指针类型,例如
*int
、*float32
等
类型检查
虽然指针和uint16 (64系统) 本质上没什么区别,如果编译器足够放宽自由,甚至可以让int类型存储地址并当作指针使用。你要强行这样做也没人拦你
Go及很多语言,为了避免程序员出错,通常编译器不让你那样做 (除非头铁强制类型转换)。某类型的地址只能由某类型指针类型存储。 例如:无法将int赋值给int指针,不能将int地址赋值给float指针,否则编译器报错