go语言的指针

什么是指针

一个指针变量指向了一个值的内存地址。(也就是我们声明了一个指针之后,可以像变量赋值一样,把一个值的内存地址放入到指针当中。)
类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
 
var var_name *var-type

  

var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针。以下是有效的指针声明:
 
var ip *int        /* 指向整型*/
var fp *float32    /* 指向浮点型 */

  

本例中这是一个指向 int 和 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 )
}

  

 
 
指向数组的指针:
    定义方式:
    var ptr [MAX]*int;
    这样的话,就等于新建了数组那么多的指针,然后等待放入相关的内存地址。
//例子:
package main
 
import "fmt"
 
const MAX int = 3
 
func main() {
    a := []int{10,100,200}
    var i int
    var ptr [MAX]*int;
    fmt.Println(ptr)   //这个打印出来是[<nil> <nil> <nil>]
 
    for  i = 0; i < MAX; i++ {
        ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
    }
 
    for  i = 0; i < MAX; i++ {
        fmt.Printf("a[%d] = %d\n", i,*ptr[i] )   //*ptr[i]就是打印出相关指针的值了。
    }
}

  

 
上面的例子当中,都是用指针直接指向一个值的内存地址。下面再来看看指向指针的指针。
 
 
 
 
 

指向指针的指针

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量。
 
当定义一个指向指针的指针变量时,第一个指针存放第二个指针的地址,第二个指针存放变量的地址:
定义方式:
var ptr **int;

  

 
package main
 
import "fmt"
 
func main() {
 
    var a int
    var ptr *int
    var pptr **int
 
    a = 3000
 
    /* 指针 ptr 地址 */
    ptr = &a
 
    /* 指向指针 ptr 地址 */
    pptr = &ptr
 
    /* 获取 pptr 的值 */
    fmt.Printf("变量 a = %d\n", a)
    fmt.Printf("指针变量 *ptr = %d\n", *ptr)
    fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
    fmt.Println("==================================")
    fmt.Printf("变量的内存地址 a = %d\n", ptr)   //ptr这个值是指向a的内存地址的。
    fmt.Printf("第一个指针变量的内存地址 *ptr = %d\n", pptr)   //pptr这个值,是指向指针ptr在内存中的地址的。
}
//打印结果
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
==================================
变量的内存地址 a = 824633761976
第一个指针变量的内存地址 *ptr = 824633745448

  

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

posted on 2019-04-17 10:30  海龟先生  阅读(2648)  评论(0编辑  收藏  举报

导航