*
操作符作为右值
时,意义是取指针的值
,作为左值
时,也就是放在赋值操作符的左边
时,表示 a 指针指向的变量
。其实归纳起来,*
操作符的根本意义就是操作指针指向的变量
。当操作在右值
时,就是取指向变量的值
,当操作
说到指针,想必很多人会谈虎色变
吧,在c/c++
语言中那晦涩难懂的指针
,曾几何时,让人望而却步!
虽说,指针操作效率是相当的快,可一旦把握不好,就会造成可怕的错误。
与c/c++
语言不同的是,在Go
中是不允许进行指针运算
的。
1、声明指针
类型 *T
是指向 T
类型值的指针。其默认值为 nil
。
var name *type
var p *int
其实,每个变量在运行时,在内存都有属于自己的内存地址,而这个地址就是代表着变量在内存的位置。
与c/c++
语言一样,要想获取变量在内存的地址,只需在变量前面加个&
即可。
func main() {
v := "https://qiucode.cn"
ptr := &v
}
其中,&v
表示取变量v
的内存地址,而变量 v 的内存地址
又赋值给变量ptr
,此时变量ptr
类型为*string
,称作string
的指针类型,*
代表指针。
package main
import "fmt"
func main() {
var age int = 4
v := "https://qiucode.cn"
ptr := &v
fmt.Printf("%p %p", &age, ptr)
}
- 指针的值是带有
0x
十六进制前缀的一组数据。
2、获取指针指向的值
当我们使用&
操作符对普通变量取地址,在得到变量的指针后,接着使用*
操作符对普通变量进行取值,也就是指针取值
。
package main
import "fmt"
func main() {
// 准备一个字符串类型
var webSite = "https://qiucode.cn"
// 对字符串取地址, ptr类型为*string
ptr := &webSite
// 打印ptr的类型
fmt.Printf("ptr 的类型: %T\n", ptr)
// 打印ptr的指针地址
fmt.Printf("ptr 指针地址: %p\n", ptr)
// 对指针进行取值操作
value := *ptr
// 取值后的类型
fmt.Printf("value 类型: %T\n", value)
// 指针取值后就是指向变量的值
fmt.Printf("value 指向变量的值: %s\n", value)
}
取地址操作符&
和取值操作符*
是一对互补操作符,&
取出地址,*
根据地址取出地址指向的值。
变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址操作使用
&
操作符,可以获得这个变量的指针变量。 - 指针变量的值是指针地址。
- 对指针变量进行取值操作使用
*
操作符,可以获得指针变量指向的原变量的值。
3、指针修改值
指针不仅可以取值,还可以修改值
package main
import "fmt"
// 交换函数
func swap(a, b *string) {
// 取a指针的值, 赋给临时变量t
t := *a
// 取b指针的值, 赋给a指针指向的变量
*a = *b
// 将a指针的值赋给b指针指向的变量
*b = t
}
func main() {
// 准备两个变量, 赋值1和2
siteName, webSite := "秋码记录", "https://qiucode.cn"
// 交换变量值
swap(&siteName, &webSite)
// 输出变量值
fmt.Println(siteName, webSite)
}
代码说明如下:
- 第 6 行,定义一个交换函数,参数为 a、b,类型都为
*string 指针类型
。 - 第 8 行,取
指针 a
的值,并把值赋给变量 t
,t 此时是string
类型。 - 第 10 行,取 b 的指针值,赋给
指针 a 指向的变量
。注意,此时*a
的意思不是取 a 指针的值,而是 a 指向的变量
。 - 第 12 行,将
t
的值赋给指针 b 指向的变量
。 - 第 16 行,准备
siteName
、webSite
两个变量,分别赋值为秋码记录
和https://qiucode.cn
,类型为string
。 - 第 18 行,取出
siteName
和webSite
的地址
作为参数传给swap() 函数
进行调用。 - 第 20 行,交换完毕时,输出
siteName
和webSite
的值。
*
操作符作为右值
时,意义是取指针的值
,作为左值
时,也就是放在赋值操作符的左边
时,表示 a 指针指向的变量
。其实归纳起来,*
操作符的根本意义就是操作指针指向的变量
。当操作在右值
时,就是取指向变量的值
,当操作在左值
时,就是将值设置给指向的变量
。