golang 指针

  • 一个指针变量指向了一个值的内存地址,类似于变量和常量,在使用指针前你需要声明指针。
  • 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。使用&字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string 等。

& 取内存地址
* 根据内存地址取值

package main

import "fmt"

func main() {
	var n1 int = 10
	fmt.Println("n1的内存地址为:", &n1)  //获取n1的内存地址值为:0xc00001c0b8
	var n2 *int = &n1              //n2为整型类指针,将n1的内存地址赋值给n2
	fmt.Println("n2的值为:", n2)      //输出的为n1的内存地址
	fmt.Println("n2地址指向的值为:", *n2) //输出的为n1的内存地址指向的值,为10
}

输出结果

n1的内存地址为: 0xc00001c0b8
n2的值为: 0xc00001c0b8
n2地址指向的值为: 10  

1. 可以通过指针改变指向值

package main

import "fmt"

func main() {
	var s1 string = "a"
	fmt.Println("s1的值为:", s1)
	var p1 *string = &s1         //定义p1的类型为字符串类型指针,将s1的内存地址赋值给p1
	*p1 = "b"                    //将p1内存地址指向的值重新赋值为b
	fmt.Println("s1的值为:", s1) //由于s1的内存地址没变,内存地址指向的值重新赋值了,所以重新输出s1的值为b
}

输出结果

s1的值为: a
s1的值为: b

2.指针变量接收的一定是地址值

package main

import "fmt"

func main() {
	var n2 int = 100
	var p2 *int = n2
	fmt.Println("p2的值为:", p2)
}

输出结果

cannot use n2 (variable of type int) as *int value in variable declaration

3.指针变量的类型不可以和内存地址不匹配

package main

import "fmt"

func main() {
	var f1 float32 = 0.123
	var p3 *float64 = &f1 //定义p3的类型为float64类型指针,将f1的内存地址赋值给p3,由于f1为float32类型,跟*float64类型不匹配
	fmt.Println(p3)
}

输出结果

cannot use &f1 (value of type *float32) as *float64 value in variable declaration
posted @ 2023-02-14 22:23  XIN-0808  阅读(28)  评论(0编辑  收藏  举报