12、Go 基础数据类型 - 指针
hi,我是温新
在 Go 语言的学习中,指针是必须要了解的。不要恐惧指针,一起来学习。
什么是指针
当一个变量被声明时,会在内存中分配一块空间,而数据就保存在这个空间中。好比变量是钥匙,分配的内存空间是门牌号(也就是地址),拿着钥匙找到对应的门牌号后就可以取出数据了。
用了大白话进行理解,那么什么是指针?指针是一个变量,其值是另一个变量的内存地址。简单的说,**指针 就是保存内存地址的特殊变量。**在 Go 语言中,通过 &
符号取出变量的内存地址。
package main
import "fmt"
func main() {
name := "自如初"
fmt.Printf("内存地址为 %p", &name) // 内存地址为 0xc00005e270
}
Go 中的指针
在 Go 语言中,指针有两个核心概念:
- 1、
类型指针
:允许对该指针的类型进行修改。传递数据使用指针时,无需拷贝数据,只地址引用地址值。类型指针不进行便宜或运算; - 2、
切片
:由起始元素的原始指针、元素数量、容量
组件。(目前暂不介绍,相关章节继续关系)。
**指针的含义:**创建地址引用,以后使用时根据地址获取值。
指针的 & 与 *
关于指针变量的声明与使用,一定要记住 &
与 *
这两个符号,其含义如下:
-
&
:取址符(也就是变量在内存中的地址,称为指针)。指针也是赋值; -
*
:指针值。用于返回一个指针变量的具体值。
指针的声明与使用
声明指针变量
指针变量类型的声明形式:var name *type
使用指针变量
package main
import "fmt"
func main() {
var name *string
// name = "meili" 赋值会报错
fmt.Println(name) // nil
}
赋值为什么会报错?指针变量是一个类型,而它存储的是内存地址,直接赋值会报错。
取址与使用
package main
import "fmt"
func main() {
// 1、声明一个 string 类型变量
name := "王美丽"
fmt.Printf("name 的内存地址%p\n", &name) // 0xc000088240
// 2、声明一个指针变量
var p1 *string
// 3、将变量 name 的内存地址赋值给变量 p1,
p1 = &name
fmt.Println("指针类型的地址", p1) // 0xc000088240
// 使用 * 对地址取值
fmt.Println("p1 的值是", *p1) // p1 的值是 王美丽
// 4、通过指针修改 name 的值
*p1 = "郝帅"
// 5、输出结果
fmt.Println("p1 修改后的值", *p1) // 郝帅
fmt.Println("name 的值", name) // 郝帅
}
1、声明一个 string 类型的变量,其名为 name 并赋值为 王美丽,其内存地址为 0xc000088240
;
2、声明一个 string 类型的指针变量,其名为 p1,此时它的值为 nil;
3、使用 &
符号取出变量 name
的内存地址,赋值给字符串类型的指针变量 p1,此时,p1 存储的值是 0xc000088240
;
4、使用 *
根据内存地址获取到变量 name 的值,并将其修改为 郝帅
;
5、*p1
和 name
的值都是 郝帅
,原因是 p1
的内存地址的值指向了变量name
的内存地址,因此修改会影响到变量 name
,所以值也就一样了。
指针在函数中的应用
package main
import "fmt"
func main() {
name := "王美丽"
ChanveValue(&name)
fmt.Println("我叫 ", name) // 我叫王美丽
}
func ChanveValue(name *string) {
*name = "我美丽"
fmt.Println("我叫", *name) // 我叫王美丽
}
通过指针,可以使用某个修改结果相互影响。
请登录后再评论