GO语言基础-04-数据类型-05-指针[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的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值