Go语言学习日记【二】【指针】

<一>  指针的概述

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

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

  2  获取变量的地址 

        Go语言中使用取地址符&,如果一个变量前使用&,则返回该变量的地址。在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为空指针
*/

 

          

      

     

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值