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 2022-12-07 10:34  运维开发玄德公  阅读(108)  评论(0编辑  收藏  举报  来源

导航