go 關於變數位址的疑惑

2022-08-15 04:33:12 字數 1563 閱讀 9562

定義一些變數,並輸出其位址

一、一般變數

var a, b int32

var c, d int64

輸出其位址

結果:a 0xc082006310

b 0xc082006320

c 0xc082006330

d 0xc082006340

結論:它們的位址間隔均為16位元組,其它空餘的位址浪費了?

二、陣列切片

e := make(byte, 40)

f := make(byte, 40)

g := make(byte, 40)

f = byte("12345678901234567890") //字串長度為20位元組

g = byte("1234567890123456789012345678901234567890") //字串長度為40位元組

1.輸出各自len()與cap()

結果:e:  40  40

f:  20  40

g:  40  40

結論:

a.切片的實際長度len()與其資料的長度相關,f[30]是不可訪問的;

b.make(byte,40)只保證其最大容量為40,即cap()=40。

2.輸出首位址及其首個

fmt.printf("&e:%p &e[0]:%p ", &e, &e[0])

fmt.printf("&f:%p &f[0]:%p ", &f, &f[0])

fmt.printf("&g:%p &g[0]:%p ", &g, &g[0])

結果:&e:0xc082008660   &e[0]:0xc08204c060  

&f:0xc082008680   &f[0]:0xc0820086c0   

&g:0xc0820086a0   &g[0]:0xc08204c0f0

結論:a.順序宣告切片變數時,它們的位址是"連續"的,分別間隔32位元組;

b.切片的資料位址與切片本身的位址無關 

3.對於以下**:

type test struct 

func (t *test) set(buf byte)

t.data=buf 意味著什麼?

a := byte("1234567890")

b := new(test)

b.set(a)

結果:&a:     0xc082002660

&a[0]:     0xc082004310

&b:     0xc082028020

&b.data:      0xc082002680

&b.data[0]:    0xc082004310

2)輸出a和b.data的len()和cap()

結果:a:    10  16

b.data:  10  16

結論:&a[0]==&b.data[0],且兩者的資料和容量均相同,所以推測t.data=buf 意味著t.data和buf指向同一段資料

檢視變數位址

在linux中寫乙個程式,裡面全域性變數,區域性變數,static,const,常數,陣列,輸出這些變數的位址 包括賦值的和沒有賦值的,各類資料型別 如下 include int a int b 1 int const c 1 int const x static int d static int ...

指標變數與變數位址

一 基本概念 儲存單元一般應具有儲存 資料和讀寫資料的功能,以8位二進位製作為乙個儲存單元,也就是乙個位元組。每個單元有乙個位址,是乙個整數 編碼,可以表示為 二進位制整數。程式中的變數和主儲存器的儲存單元相對應。變數的名字對應著儲存單元的位址,變數內容對應著 單元所儲存的資料。儲存位址一般用十六進...

區域性變數位址的返回

char fun 這個函式的返回值?以及這個函式在棧上的儲存布局 include include include char fun int main int argc,const char argv 就函式而言,返回區域性變數的位址這種做法是錯誤的,但是這個函式不管是在vs還是在gcc上編譯時都只會...