06-指针(pointer)

说明:指针变量指向了一个值的内存地址

1. 声明指针

仅声明的指针是空指针

  • 语法
var PointerName *type
  • 语法示例
var intPointer *int
var floatPoiner *float32
var stringPointer *string
  • 完整示例
package main
import "fmt"
func main() {
var stringPointer *string
fmt.Println("指针值:",stringPointer)
}

结果:

指针值: <nil>

注意:指针为空的时候,打印指针指向的值,程序会崩溃

2. 初始化指针

初始化之后,指针不在为空,其指向值为默认值(比如:string为空,int为0)

  • 语法
pointerName := new(type)
  • 语法示例
stringPointer := new(string)
  • 完整示例
package main
import (
"fmt"
"reflect"
)
func main() {
stringPointer := new(string)
fmt.Printf("stringPointer类型为:%s\n",reflect.TypeOf(stringPointer))
if stringPointer == nil{
fmt.Println("指针为空")
}else {
fmt.Println("指针值:",stringPointer)
}
}

结果

stringPointer类型为:*string
指针值: 0xc000040250

0xc000040250为一个存储字串值的内存地址

3. 指针赋值

  • 语法
PointerName := &VariableName

说明:

  • 指针的值是一个内存地址,指针指向值是这个内存地址存储的数据。
  • 指针指向的值为: *PointerName
  • 变量的内存地址为: &VariableName
  • 完整示例
package main
import (
"fmt"
"reflect"
)
func main() {
name := "刘备" //定义一个字串
namePointer := &name //指针指向该字串
fmt.Printf("nameProinter类型为:%s\n",reflect.TypeOf(namePointer))
fmt.Println("指针值:",namePointer)
fmt.Println("指针指向值:",*namePointer)
}

结果

nameProinter类型为:*string
指针值: 0xc000040250
指针指向值: 刘备

4. 空指针判断

上文声明指针的时候我们了解了什么是空指针,也知道了空指针打印指向值程序会崩溃。
程序中为避免这种情况,我们在使用指针指向值的时候,需要对空指针进行判断。

  • 下边代码程序会崩溃

下边代码我们注释掉给指针赋值的两行,因为指针即没有赋值也没有初始化,因此指针为空。打印指针指向结果时,程序将崩溃。

package main
import "fmt"
func main() {
//name := "刘备"
var namePointer *string
//namePointer = &name
fmt.Println("namePointer 指向值为:",namePointer)
}
  • 指针判断
package main
import "fmt"
func main() {
//name := "刘备"
var namePointer *string
//namePointer = &name
if namePointer == nil{
fmt.Println("指针为空")
}else {
fmt.Println("指针指向值为:",*namePointer)
}
}

结果

指针为空

5. 指向指针的指针

package main
import "fmt"
func main() {
name := "刘备"
nameP := &name //指针
namePP := &nameP //指向指针的指针
fmt.Println("namePP:",namePP)
fmt.Println("*namePP:",*namePP,"\tnameP:",nameP)
fmt.Println("**namePP:",**namePP) //打印指向指针的指针的指向值的指向值
}

结果:

namePP: 0xc00000a028
*namePP: 0xc000040250 nameP: 0xc000040250
**namePP: 刘备

如上可见:

  • namePP是指向指针的指针,
  • *namePP是“指向指针的指针”的指向值,即指针nameP的值,也就是存储变量name值的内存地址。
  • 继续推,可知**namePP即是变量name的值

posted on   运维开发玄德公  阅读(152)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2021-12-07 【夜莺监控方案】05-监控postgre 集群(prometheuse+n9e+postgres_exporter)
2021-12-07 【prometheuse监控方案】监控postgre集群(prometheuse+grafna+postgres_exporter)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示