1. 程式人生 > >一分鐘看懂為什麼處處都要取地址(&)

一分鐘看懂為什麼處處都要取地址(&)

        許多初學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!這樣就沒有問題啦!!

我們再看一下監視:

最後,來跟著我讀:

形參是實參的一份臨時拷貝,對形參的修改不會改變實參!!!