go之變量、指針、引用地址


一、值類型

  • 定義和說明
定義:變量直接指向存在內存中的值,我們稱之為值類型。

值類型的變量的值存儲在棧中。
值類型 將一個變量賦值給另一個變量 被稱為值拷貝
  • 實例
package main

import "fmt"

func main(){
	var num1,num2 int
	num1 = 10
	num2 = num1 // 值類型賦值操作

	fmt.Println(num1,num2) // 10 10

	num1 = 20
	fmt.Println(num1,num2) // 20 10
}

二、指針類型

  • 定義
一個變量指向內存中值所在的內存地址,我們稱這個變量為指針類型

go 語言中的指針與C/C++ 中的指針用法是一樣的,只是出於安全性的考慮go增加了:
    1、不同類型的指針不能互相轉化
    2、任何普通指針類型*T和uintptr之間不能互相轉化
    3、指針變量不能進行運算
  • 實例
package main

import "fmt"

func main(){
	var num int = 100
	var ptr *int  // 類型前 加 * 表示這是指針類型,指針類型的初始值為nil ,和其他語言的NUll,None一樣
		ptr = &num // & 取num 變量的內存地址。 因為ptr 是指針,指向的是內存地址,所以需要賦值操作的是內存地址
		fmt.Println("ptr 指針的值:",ptr)
		fmt.Println("*ptr 指針的值:",*ptr) // * 取指針內存地址所指向的值

		num = 200
		fmt.Println("*ptr 指針的值:",*ptr)

}

結果:
ptr 指針的值: 0xc000048080
*ptr 指針的值: 100
*ptr 指針的值: 200
  • *ptr 沒有操作,為什么值發生了變化
ptr 是指針類型,並被賦予了 num 的內存地址,當num值發現變化時,實際也就是 ptr 內存地址所對應的值變了
因為 ptr內存地址所對應的 內存值就是num的值

三、值與內存地址與指針

1、變量是抽象出來的概念,go語言程序運行時即表示內存值
2、內存地址即 內存值所在的內存空間的編號
3、指針變量:是一種占位符,用於引用計算機的內存地址。可理解為內存地址的標簽

四、取地址與解引用

  • 說明
在go語言中我們可以通過
    & 是取地址符號 , 即取得某個變量的地址 , 如 ; &a
    * 是指針運算符 , 可以表示一個變量是指針類型 , 也可以表示一個指針變量所指向的存儲單元 , 也就是這個地址所存儲的值
  • 運用
package main

import "fmt"

func main(){
	var n1,n2,n3 int
	n1 = 100
	n2 = 200
	n3 = 3
	swap(&n1,&n2) // 傳內存地址
	add(&n3) // 取內存地址
	fmt.Println(n1)  // 200
	fmt.Println(n2) // 100
	fmt.Println(n3) // 4


	var num *int  // 申明一個int 指針類型
	num = &n3  // 所以可以賦值 內存地址
	add(num)
	fmt.Println("num指針變量的內存值:",*num) // *num == 5 
	// 此時n3 == 5
}


// 傳入 兩個指針類型的數據.
func swap(i,j *int){
	*i,*j = *j,*i // 值的替換
}

func add(num *int){
	// *num 解引用
	*num = *num + 1
}

五、引用類型

golang 沒有引用類型。。。。。


免責聲明!

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



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