方法(函式)中傳入的引數有新的記憶體地址
區域性變數(在方法或函式中聲名的變數):
- 自動儲存期限:當方法返回後,將自動回收區域性變數的記憶體地址。
- 程式塊作用域:區域性變數的作用域是從方法的開始到方法的結束。
現實是:對傳入的引數進行修改,如果不return的話是拿不到修改後的引數的,也就是對引數的修改是沒有意義的。
程式碼證明:
#include<stdio.h>
void method(int i,int j){
i=999;
j=999;
}
int main() {
//聲名兩個變數並賦值。
int i=100;
int j=1;
//呼叫method方法併為i和j賦上新的值
method(i,j);
//列印i和j的值
printf("%d\n%d",i,j);
return 0;
}
列印:
100
1
上述程式碼聲名了兩個int並賦值,隨後在方法中給他們傳遞新的值,列印結果顯示,跳出了方法之後,賦上的新的值丟失了。
為什麼會這樣
進入正題
下列程式碼列出了變數進入方法後記憶體地址的改變情況:
#include<stdio.h>
void method(int i,int j){
//列印傳入的引數i和j的記憶體地址。
printf("傳入方法後i和j的記憶體地址:%p %p",&i,&j);
}
int main() {
//聲名兩個變數並賦值。
int i=100;
int j=1;
//列印i和j的指標(即記憶體地址),&就是取址。
printf("i和j的記憶體地址: %p %p\n",&i,&j);
//呼叫method方法。
method(i,j);
return 0;
}
列印(前方高能):
i和j的記憶體地址: 0061FF2C 0061FF28
傳入方法後i和j的記憶體地址:0061FF10 0061FF14
驚呆了有木有!
進入方法之後的引數,直接在方法中新申請了一個記憶體地址來儲存傳入的引數。
//也就是
void method(int a,int b){
}
//實際上在方法內部進行了
void method(int a,int b){
int a=a;
int b=b;
}
//即重新申請了新的變數,因此才有了不同的記憶體地址!
結論:結論即標題,方法中傳入的引數有新的記憶體地址,這就是為什麼對引數的修改在跳出方法之後不會影響原本的變數。
相關文章
- python中函式引數傳遞的幾種方法Python函式
- php函式引用傳遞引數的方法PHP函式
- 函式中引數傳值函式
- OC-從記憶體角度理解block可作為方法傳入引數的原因記憶體BloC
- python中函式的引數傳遞Python函式
- 函式的引數傳遞函式
- 【Java基礎】函式引數為物件時的記憶體管理Java函式物件記憶體
- js中 函式引數的 傳值/傳引用 問題JS函式
- Python中將函式作為另一個函式的引數傳入並呼叫Python函式
- Main函式引數argc,argv如何傳入AI函式GC
- 程式中的函式引數函式
- 如何計算PHP函式中傳遞的引數數量PHP函式
- 使用java模擬scala函數語言程式設計將函式作為引數傳入方法中Java函數程式設計函式
- Jmeter使用_time函式實現同一個介面引數傳入可以每次傳入不同的引數JMeter函式
- 函式定義、函式的引數、函式的預設引數函式
- C++ 解引用與函式基礎:記憶體地址、呼叫方法及宣告C++函式記憶體
- 指標:存放記憶體地址的變數指標記憶體變數
- fork函式中的記憶體複製和共享函式記憶體
- Python的函式引數傳遞:傳值?引用?Python函式
- JavaScript函式傳遞引數JavaScript函式
- JavaScript函式引數傳遞JavaScript函式
- Delphi 的記憶體操作函式(5): 複製記憶體記憶體函式
- 方法(函式)的定義與引數函式
- js中函式引數值傳遞和引用傳遞JS函式
- innodb的幾個記憶體引數記憶體
- 函式呼叫引數變數傳值的問題函式變數
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- Oracle 10g中,記憶體引數Oracle 10g記憶體
- 共享記憶體函式記憶體函式
- Python 函式中,引數是傳值,還是傳引用?Python函式
- python 函式引數的傳遞(引數帶星號的說明)Python函式
- 函式作為引數傳遞函式
- setInterval 回撥函式傳引數函式
- 函式引數傳遞及返回函式
- linux下的記憶體共享引數Linux記憶體
- mysql用於分配記憶體的引數MySql記憶體
- 函式中的指標分配的記憶體怎麼釋放函式指標記憶體
- 傳說中的記憶體溢位記憶體溢位