golang – 指针(上篇)

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

1.1 指针的概念

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

我们都知道,变量是一种使用方便的占位符,用于引用计算机内存地址。

一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址。

在上面的图中,变量b的值为156,存储在内存地址0x1040a124。变量a持有b的地址,现在a被认为指向b。

#1.2 获取变量的地址

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

package main

import "fmt"

func main() {
   var a int = 10   

   fmt.Printf("变量的地址: %x\n", &a  )
}
复制代码

运行结果:

变量的地址: 20818a220
复制代码

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

var var_name *var-type
复制代码

var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。

var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮点型 */
复制代码

示例代码:

package main

import "fmt"

func main() {
   var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */

   ip = &a  /* 指针变量的存储地址 */

   fmt.Printf("a 变量的地址是: %x\n", &a  )

   /* 指针变量的存储地址 */
   fmt.Printf("ip 变量的存储地址: %x\n", ip )

   /* 使用指针访问值 */
   fmt.Printf("*ip 变量的值: %d\n", *ip )
}
复制代码

运行结果:

a 变量的地址是: 20818a220
ip 变量的存储地址: 20818a220
*ip 变量的值: 20
复制代码

示例代码:

package main

import "fmt"

type name int8
type first struct {
    a int
    b bool
    name
}

func main() {
    a := new(first)
    a.a = 1
    a.name = 11
    fmt.Println(a.b, a.a, a.name)
}
复制代码

运行结果:

false 1 11
复制代码

未初始化的变量自动赋上初始值

package main

import "fmt"

type name int8
type first struct {
    a int
    b bool
    name
}

func main() {
    var a = first{1, false, 2}
    var b *first = &a
    fmt.Println(a.b, a.a, a.name, &a, b.a, &b, (*b).a)
}
复制代码

运行结果:

false 1 2 &{1 false 2} 1 0xc042068018 1
复制代码

获取指针地址在指针变量前加&的方式

#空指针

Go 空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。 nil 指针也称为空指针。 nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。 一个指针变量通常缩写为 ptr。

空指针判断:

if(ptr != nil)     /* ptr 不是空指针 */
if(ptr == nil)    /* ptr 是空指针 */
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享