【Go】指針

1 go語言中指針基本內容

package main

import "fmt"

/**
指針是存儲另一個變量內存地址的變量
*/

func main() {
	// 1.定義一個int類型變量
	a := 5
	fmt.Println("a的數值:", a)
	fmt.Printf("a的類型:%T\n", a)
	fmt.Printf("a的地址:%p\n", &a)
	// 2.聲明一個指針
	/*
		var 變量名 *指向變量類型
	*/
	var p1 *int
	fmt.Println(p1)            // nil 空指針
	p1 = &a                    // 讓指針變量p1指向a的地址
	fmt.Println("p1的數值:", p1)  // 即a的地址值
	fmt.Println("p1的地址:", &p1) //獲取p1自身地址
	// 通過在指針變量前加上*獲取指針對應的值
	fmt.Println("p1的數值是a的地址,該地址存儲的值爲:", *p1)
	// 3.操作變量,更改被指向變量的值
	a = 100
	fmt.Println(a)
	fmt.Printf("a的地址:%p", &a)
	// 4.通過指針,改變變量的數值
	*p1 = 200
	fmt.Println(a)
	// 5.指針的指針,存儲指針的變量
	var p2 **int                        // 空指針
	p2 = &p1                            // 將p1的地址賦給p2
	fmt.Printf("%T,%T,%T\n", a, p1, p2) // int *int **int
	fmt.Println("p1的地址:", p2)
	fmt.Printf("p2自己的地址:%p\n", &p2)
	fmt.Println("p2中存儲的地址,對應的數值,也就是p1的地址,對應的數據:", *p2)
	fmt.Println("p2中存儲的地址,對應的數值,也就是p1的地址,p1地址對應的數據即a的數值:", **p2)
	fmt.Print("--------------------------------\n")
	// 6.數組的指針,首先是一個指針,一個數組的地址
	// 6.1 創建一個普通的數組
	arr1 := [4]int{1, 2, 3, 4}
	fmt.Println(arr1)
	// 6.2 創建一個指針,存儲該數組的地址 -->數組指針
	var par1 *[4]int
	par1 = &arr1
	fmt.Println(par1)
	fmt.Printf("%p\n", par1)  // 數組的值
	fmt.Printf("%p\n", &par1) // 指針自己的地址
	// 6.3 根據數組指針,操作數組,通過下標(索引)
	(*par1)[0] = 100 // 設置值, 簡寫 ==> par1[0]=100
	fmt.Println(arr1)
	// 7.指針數組,存儲指針的數組
	b := 1
	c := 2
	d := 3
	e := 4
	arr2 := [4]int{b, c, d, e}      // int數組
	arr3 := [4]*int{&b, &c, &d, &e} // 存儲指針的數組
	fmt.Println(arr2)
	fmt.Println(arr3)
	arr2[0] = 100 // 修改arr2中的值
	fmt.Println(arr2)
	fmt.Println(b)    // 原值未變化
	*arr3[0] = 200    // arr3[0]取出b的地址,加上*即對b進行操作
	fmt.Println(arr3) //地址不變
	fmt.Println(b)    // 原值變化
	fmt.Print("--------------------------------\n")
	// 8.函數指針,一個指向函數的指針,go中函數默認看作一個指針
	var f1 func() // 創建一個空函數變量
	f1 = fun1     // f1指向fun1函數
	f1()          // 調用函數fun1

	// 9.指針函數,一個返回值爲指針的函數
	arr4 := fun2()
	fmt.Printf("arr4的類型:%T,地址:%p,數值:%v\n", arr4, &arr4, arr4)
	arr5 := fun3()
	fmt.Printf("arr5的類型:%T,地址:%p,數值:%v\n", arr5, &arr5, arr5)
	// 10.指針作爲參數
	x := 100
	fun4(&x)
	fmt.Println("調用函數後x的值:", x) // 原值被修改
	y := [4]int{2, 3, 4, 5}
	fun5(y)
	fmt.Println("調用fun5函數後y的值:", y)
	fun6(&y)
	fmt.Println("調用fun6函數後y的值:", y) // 值被修改

}

// 傳入一個引用類型的變量數組
func fun5(arr [4]int) {
	fmt.Println("fun5函數中數組的值:", arr)
	arr[0] = 50 // 修改第一個值
	fmt.Println("fun5函數修改數組後的的值:", arr)
}
// 傳入數組的指針函數
func fun6(p *[4]int){
	fmt.Println("fun6函數中數組的值:", p)
	p[1] = 100
	fmt.Println("fun6函數中修改數組後的值:", p)
}

// 參數爲指針的函數
func fun4(p1 *int) {
	fmt.Println("fun4函數中p1:", *p1)
	*p1 = 300 // 修改傳入的指針變量內容
	fmt.Println("fun4函數中修改後的p1:", *p1)

}
func fun1() {
	fmt.Println("fun1...")
}

// 普通函數
func fun2() [4]int {
	arr := [4]int{7, 8, 9, 10}
	return arr
}

// 返回指針的函數
func fun3() *[4]int {
	arr := [4]int{1, 2, 3, 4}
	return &arr
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章