跳至主要內容

指针类型

LincZero大约 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
}

一些特性

一些废话 (其他语言基本都是这样)

  1. 可以通过指针改变指向值
  2. 类型检查
    • 指针变量接收的一定是地址值
    • 指针变量的地址不可以不匹配
  3. 基本数据类型 (又叫值类型),都有对应的指针类型,例如 *int*float32

类型检查

虽然指针和uint16 (64系统) 本质上没什么区别,如果编译器足够放宽自由,甚至可以让int类型存储地址并当作指针使用。你要强行这样做也没人拦你

Go及很多语言,为了避免程序员出错,通常编译器不让你那样做 (除非头铁强制类型转换)。某类型的地址只能由某类型指针类型存储。 例如:无法将int赋值给int指针,不能将int地址赋值给float指针,否则编译器报错

操作

话说Go好像传递的都是指针,没引用么?