值傳遞與位址傳遞(從棧和堆的角度分析)

2021-10-03 05:56:07 字數 2493 閱讀 5911

1.基本資料型別的資料儲存在棧中;

2.除基本資料型別外的資料型別(就是引用型別)的資料儲存在堆中,引用型別的資料都會分配乙個位址儲存在棧中。

3.用system.out.println();語句輸出的資料是棧中儲存的資料。

例1

int a =10;

//int 是基本資料型別

system.out.

println

(a);

結果

10
int是基本資料型別,當a被賦值10時,10被存入了棧中。輸出時輸出棧中的內容,也就是10.

例2

int a=10;

int b = a;

system.out.

println

(b);

結果

10
給a賦值時,10存入了棧中,將a的值傳遞給b時,其實是將a的值複製一下貼上到b在棧中的儲存空間中了,並沒有改變a的值。

例3

int ages =

;//陣列是引用型別。

system.out.

println

(ages)

;

結果

[i@52e922
陣列的資料儲存在堆中,棧中儲存的是資料的位址,所以例3輸出的結果是位址。

結果

100

100

賦值其實是將棧中的資料複製貼上。輸出時也只輸出棧中的資料。基本資料型別只在棧中搞事情,堆中不開闢空間。

例4

int c =

;int d =

newint[2

];d=c;

system.out.

println

(d);

system.out.

println

(d[0])

;

結果

[i@52e922

100

100和200存入了堆中。這是把陣列c的棧中的位址複製到了陣列d的棧中,使陣列c和d指向同乙個堆。

100和200存入了堆中。這是把陣列c的棧中的位址複製到了陣列d的棧中,使陣列c和d指向同乙個堆。

例5

public

static

void

main

(string[

] args)

; system.out.

println

(c[0])

;//輸出:100

test

(c);

system.out.

println

(c[0])

;//輸出:0

}public

static

void

test

(int array )

結果

位址傳遞後陣列c和陣列array的位址相同,都指向堆中的同乙個記憶體空間,所以array[0]=0;改變了堆中的資料,影響了陣列c的值。

從棧和堆中來看值傳遞和引用傳遞

棧是乙個記憶體陣列,是乙個lifo last in first out,後進先出 的資料結構。棧儲存幾種型別的資料 某些型別變數的值 程式當前的執行環境 傳遞給方法的引數。棧有如下幾個特徵 資料只能從棧的頂端插入和刪除。把資料放到棧頂稱為入棧 push 從棧頂刪除資料稱為出棧 pop 棧是在編譯期,...

值傳遞與位址傳遞的區別

1.考題一 程式 如下 void exchg1 int x,int y inttmp tmp x x y y tmp printf x d,y d n x,y void main inta 4,b 6 exchg1 a,b printf a d,b d n a,b 輸出的結果 x y a b 問下劃...

詳述值傳遞和位址傳遞

1.值傳遞 值傳遞可以簡單的理解為將實參的值傳遞給形參,之後即使修改了形參的值,實參的值還是不會改變。package yang public class yangyujie 執行結果 102.位址傳遞 位址傳遞,顧名思義傳遞的是位址,實參和形參指向同乙個位址,改變形參的值是可以改變實參的值的。pac...