GOlang 指針

package main

import (
   "flag"
   "fmt"
)

func main() {
   //指針
   var cat int = 1
   var str string = "ba"
   fmt.Printf("%p %p\n", &cat, &str)
   // 變量 指針和地址三者關係 每個變量都擁有地址 指針的值就算地址

   //當使用 &操作符對普通變量進行取地址操作並得到變量的指針後可以對指針使用 *操作符也就是指針取值
   // 準備一個字符串
   var house = "my name is 111"
   //對字符串進行取地址
   ptr := &house
   //打印出 ptr類型
   fmt.Printf("type %T\n", ptr)
   //打印出 ptr指針地址
   fmt.Printf("addr %p\n", ptr)
   //對指針進行取值操作
   value := *ptr
   // 取值後的類型
   fmt.Printf("value type: %T\n", value)
   // 指針取值後就是指向變量的值
   fmt.Printf("value: %s\n", value)
   //取地址操作符&和取值操作符*是一對互補操作符,&取出地址,*根據地址取出地址指向的值。

   //使用指針修改值
   x, y := 1, 2
   swap(&x, &y)
   //輸出
   fmt.Println(x, y)
   //定義命令行參數
   var mode = flag.String("mode", "", "process mode")
   //解析命令參數
   flag.Parse()
   // 輸出命令行參數
   fmt.Println(*mode)

   //創建指針的另一種方法——new() 函數
   str_1 := new(string)
   *str_1 = "Go語言教程"
   fmt.Println(*str_1)
}

//交換函數
func swap(a, b *int) {
   // 取a指針的值, 賦給臨時變量t
   t := *a
   // 取b指針的值, 賦給a指針指向的變量
   *a = *b
   // 將a指針的值賦給b指針指向的變量
   *b = t

}
/*
第 6 行,定義一個交換函數,參數爲 a、b,類型都爲 *int 指針類型。
第 9 行,取指針 a 的值,並把值賦給變量 t,t 此時是 int 類型。
第 12 行,取 b 的指針值,賦給指針 a 指向的變量。注意,此時*a的意思不是取 a 指針的值,而是“a 指向的變量”。
第 15 行,將 t 的值賦給指針 b 指向的變量。
第 21 行,準備 x、y 兩個變量,分別賦值爲 1 和 2,類型爲 int。
第 24 行,取出 x 和 y 的地址作爲參數傳給 swap() 函數進行調用。
第 27 行,交換完畢時,輸出 x 和 y 的值。

*操作符作爲右值時,意義是取指針的值,作爲左值時,也就是放在賦值操作符的左邊時,表示 a 指針指向的變量。
其實歸納起來,*操作符的根本意義就是操作指針指向的變量。當操作在右值時,就是取指向變量的值,當操作在左值時,就是將值設置給指向的變量
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章