<一>  指针的概述

   1  指针是存储另一个变量内存地址的变量

  •    变量是一种使用方便的占位符,变量都指向计算机的内存地址。
  •    一个指针变量可以指向任何一个值的内存地址
  •   变量b的值为156,存储的内存地址为0x104a124,变量a持有变量b的内存地址,则被认为变量a指向b  。  

  2  获取变量的地址 

在go语言中,指针不能参与运算。

  3  脚本示例

package  main

import "fmt"

func main() {
a := 10
fmt.Printf("变量的地址为:%x\n",&a)

b := []int {1,3,5,6}
fmt.Printf("变量的地址为:%x\n",&b)
}


/*
变量的地址为:c00000a0c8
变量的地址为:&[1 3 5 6]
*/

 

<二> 定义指针

   1  声明指针,*T是指针变量的类型,它指向T类型的值

           var 指针变量名 * 指针类型

                   *     *号用于指定变量的一个指针。

                   *     var ip *int   // 指向整型的指针

                   *      var fp *float32 // 指向浮点型的指针

   2  如何使用指针?(指针使用流程)

                   *    定义指针变量

                   *     为指针变量赋值

                   *     访问指针变量中指向地址的值

                   *     获取指针的值:在指针类型的变量前加* 号,(前缀)来获取指针所指向的内容。

                          获取一个指针意味着访问指针指向的变量的值。语法是:*a

         脚本示例


package  main

import (
"fmt"
)

func main() {
// 定义一个实际变量
a := 120

// 声明一个指针变量
var ip *int

// 给指针变量赋值,将变量a的地址赋值给ip
ip = &a

// 打印类型和值
fmt.Printf("a 的类型是%T,值是%v\n",a,a)
fmt.Printf("&a 的类型是%T,值是%v\n",&a,&a)
fmt.Printf("ip 的类型是%T,值是%v\n",ip,ip)
fmt.Printf("*ip 的类型是%T,值是%v\n",*ip,*ip)
fmt.Printf("*&a 的类型是%T,值是%v\n",*&a,*&a)

}


/*
a 的类型是int,值是120
&a 的类型是*int,值是0xc000070090
ip 的类型是*int,值是0xc000070090
*ip 的类型是int,值是120
*&a 的类型是int,值是120
*/

   <三> 复合数据类型指针及空指针 

     1   复合类型指针

      脚本示例


package  main

import "fmt"

type students struct {
name string
age int
marrid bool
sex int8
}


func main() {
stud_1 := students{"zhangsan",35,true,1}
stud_2 := students{"xiaohong",20,false,0}

var a *students = &stud_1
var b *students = &stud_2

fmt.Printf("\n------------------------------------------------\n")
fmt.Printf("stud_1的类型为%T,值为%v\n",stud_1,stud_1)
fmt.Printf("stud_2的类型为%T,值为%v\n",stud_2,stud_2)

fmt.Printf("\n------------------------------------------------\n")
fmt.Printf("a的类型为%T,值为%v\n",a,a)
fmt.Printf("b的类型为%T,值为%v\n",b,b)

fmt.Printf("\n------------------------------------------------\n")
fmt.Printf("*a的类型为%T,值为%v\n",*a,*a)
fmt.Printf("*b的类型为%T,值为%v\n",*b,*b)

fmt.Printf("\n------------------------------------------------\n")
fmt.Println(stud_1.name,stud_1.age,stud_1.marrid,stud_1.sex)
fmt.Println(a.name,a.age,a.marrid,a.sex)
fmt.Println((*a).name,(*a).age,(*a).marrid,(*a).sex)
fmt.Println(&a.name,&a.age,&a.marrid,&a.sex)
}

/*
------------------------------------------------
stud_1的类型为main.students,值为{zhangsan 35 true 1}
stud_2的类型为main.students,值为{xiaohong 20 false 0}

------------------------------------------------
a的类型为*main.students,值为&{zhangsan 35 true 1}
b的类型为*main.students,值为&{xiaohong 20 false 0}

------------------------------------------------
*a的类型为main.students,值为{zhangsan 35 true 1}
*b的类型为main.students,值为{xiaohong 20 false 0}

------------------------------------------------
zhangsan 35 true 1
zhangsan 35 true 1
*/

     2  空指针

            1)go空指针:

                       *  当一个指针被分配后没有分配到任何变量时,它的值为nil

                       *  nil指针也称为空指针

                       *  nil在概念上和其他语言的null,None,NULL一样,都指代零值或空值

                       *  一个指针变量通常缩写为ptr

            脚本示例


package main

import "fmt"

func main() {
var ptr *int
fmt.Println("ptr类型为%T,值为%v\n",ptr,ptr)

if ptr == nil {
fmt.Println("ptr为空指针")
} else {
fmt.Println("ptr为非空指针")
}
}

/*
ptr类型为*int,值为<nil>
ptr为空指针
*/