一分鐘看懂為什麼處處都要取地址(&)
阿新 • • 發佈:2018-12-12
許多初學C語言的小夥伴對這個操作符並不陌生,似乎它的用法也不怎麼難。但是,它為什麼要這樣那樣用呢,各種用法也是讓人摸不著頭腦。
今天,就由我——register_data 來帶大家解決各種疑難雜症。
為什麼一個scanf()就非要用&?
為什麼有的函式傳參時要傳入地址?
先看一道我們已經熟知的題目,話不多說,直接丟程式碼。
//將三個整型由大到小排序輸出 #include <stdio.h> void Swap(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } int main() { int a; int b; int c; scanf("%d%d%d", &a, &b, &c); if (a < b) { Swap(a, b); } if (a < c) { Swap(a, c); } if (b < c) { Swap(b, c); } printf("%d %d %d", a, b, c); return 0; }
讓我們瞧一瞧這波程式碼的執行結果:
biu~biu~biu~~~
aoai!“程式碼沒有問題!” 為何沒有達到預期演算法效果?
那怎麼搞?不慌不慌,當然是除錯啦,用意念除錯?No!看操作。
不難看出,實參a,b的值傳到了形參x,y,同時在函式內部,x,y也進行了交換,問題就在於函式返回之後,實參的值並未被改變。
需要注意的是,實參a,b與形參x,y的地址並不相同。
so,來跟我一起讀:
形參是實參的一份臨時拷貝,對形參的修改不會改變實參。
那麼,此時是不是需要在Swap()函式內部操作這個實參,因此就必須傳進去它的地址。
ofcourse,在傳參時就可以這樣操作,Swap(&a,&b),那傳進去實參的地址,當然要用一個指標來接收,所以,函式定義部分修改為void Swap(int* x, int* y),修改之後的程式碼為:
#include <stdio.h> void Swap(int*x, int*y) { int tmp = 0; tmp = *x; *x = *y; *y = tmp; } int main() { int a; int b; int c; scanf("%d%d%d", &a, &b, &c); if (a < b) { Swap(&a, &b); } if (a < c) { Swap(&a, &c); } if (b < c) { Swap(&b, &c); } printf("%d %d %d", a, b, c); return 0; }
Perfect!這樣就沒有問題啦!!
我們再看一下監視:
最後,來跟著我讀:
形參是實參的一份臨時拷貝,對形參的修改不會改變實參!!!