1. 程式人生 > >Go語言學習六:指標與傳遞到函式的指標

Go語言學習六:指標與傳遞到函式的指標

package main

import (
	"fmt"
)

const MAX int = 3

func main() {
	var a int = 20
	var ip *int /* 宣告指標變數 */

	ip = &a

	ip = &a /* 指標變數的儲存地址 */

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

	/* 指標變數的儲存地址 */
	fmt.Printf("ip 變數的儲存地址: %x\n", ip)

	/* 使用指標訪問值 */
	fmt.Printf("*ip 變數的值: %d\n", *ip)

	// 	當一個指標被定義後沒有分配到任何變數時,它的值為 nil。
	// nil 指標也稱為空指標。
	// nil在概念上和其它語言的null、None、nil、NULL一樣,都指代零值或空值。
	// 一個指標變數通常縮寫為 ptr。
	var ptr *int
	fmt.Printf("ptr 的值為 : %x\n", ptr) //這裡指標是0
	if ptr == nil {                   /* ptr 不是空指標 */
		fmt.Println("這是空指標")
	}

	// 指標陣列
	a1 := []int{10, 100, 200}
	var i int

	for i = 0; i < MAX; i++ {
		fmt.Printf("a1[%d] = %d\n", i, a1[i])
	}
	// 有一種情況,我們可能需要儲存陣列,這樣我們就需要使用到指標。
	var ptr1 [MAX]*int //只有常量才能設定成員數量
	for i = 0; i < MAX; i++ {
		ptr1[i] = &a1[i] /* 整數地址賦值給指標陣列 */

	}
	for i = 0; i < MAX; i++ {
		fmt.Printf("a[%d] = %d\n", i, *ptr1[i])
	}

	// 指向指標的指標
	var a2 int
	var ptr2 *int
	var pptr2 **int

	a2 = 3000
	/* 指標 ptr 地址 */
	ptr2 = &a2

	/* 指向指標 ptr 地址 */
	pptr2 = &ptr2

	/* 獲取 pptr 的值 */
	fmt.Printf("變數 a = %d\n", a2)
	fmt.Printf("指標變數 *ptr = %d\n", *ptr2)
	fmt.Printf("指向指標的指標變數 **pptr = %d\n", **pptr2)

	// 指標作為函式引數
	 /* 定義區域性變數 */
   var a3 int = 100
   var b int= 200

   fmt.Printf("交換前 a3 的值 : %d\n", a3 )
   fmt.Printf("交換前 b 的值 : %d\n", b )

   /* 呼叫函式用於交換值
   * &a3 指向 a3 變數的地址
   * &b 指向 b 變數的地址
   */
   swap(&a3, &b);

   fmt.Printf("交換後 a3 的值 : %d\n", a3 )
   fmt.Printf("交換後 b 的值 : %d\n", b )

}

// 指標作為函式引數
func swap(x *int, y *int) {
   var temp int
   temp = *x    /* 儲存 x 地址的值 */
   *x = *y      /* 將 y 賦值給 x */
   *y = temp    /* 將 temp 賦值給 y */
}