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

  

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM