方法(函式)中傳入的引數有新的記憶體地址

weixin_34365417發表於2018-01-07

區域性變數(在方法或函式中聲名的變數):

  1. 自動儲存期限:當方法返回後,將自動回收區域性變數的記憶體地址。
  2. 程式塊作用域:區域性變數的作用域是從方法的開始到方法的結束。

現實是:對傳入的引數進行修改,如果不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;
}
//即重新申請了新的變數,因此才有了不同的記憶體地址!

結論:結論即標題,方法中傳入的引數有新的記憶體地址,這就是為什麼對引數的修改在跳出方法之後不會影響原本的變數。


相關文章