1. 程式人生 > >兩個數的交換——指標

兩個數的交換——指標

int main()
{
	int a = 10;
	int b = 20;
	printf("%d,%d\n",a,b);
	Swap(&a,&b);
	printf("%d,%d\n",a,b);
        return 0;
}
void Swap1(int a,int b)
{
   int tmp = a;
    a = b;
    b = tmp;
    printf("%d,%d\n",a,b);
}

通常我們寫兩個數交換採用函式Swap,但在子函式中形參僅僅是與實參的值相同,子函式中a,b與main函式中值相同,但這兩個不是同一個地址,不能代表同一個變數,所以Swap函式中只是把變數值交換,但a與b在main中還是沒有進行交換。

void Swap2(int *p1,int *p2){int *tmp = p1;p1 = p2;p2 = tmp;}既然在Swap1 中行參與實參僅是值相同,代表的地址不同,那我們在Swap2中將a,b的地址傳給形參,這下實參於形參所代表的是同一個變量了。但在執行的時候我們發現程式依然不對,為什麼呢?

因為我們雖然傳得是a,b的地址但我們仍然是在p1,p2兩個指標上進行交換,沒有轉到a,b上,所以這個Swap2函式中p1,p2中的地址地址進行交換了但與a,b沒有任何關係開始是p1與a 有關係,p2與b有關係,現在是p2與a有關係p1與b有關係,a,b值仍未交換。

void Swap3(int *p1,int *p2)
{
	int *tmp;//野指標,懸掛指標
	*tmp = *p1;
	*p1 = *p2;
	*p2 = *tmp;
}
傳的是a,b的地址Swap2是在p1,p2 指標上操作的,那我們在Swap3中引用解引用轉到a,b上操作,但是執行的時候程式崩潰了為什麼呢?tmp:野指標我們定義了這個指標未賦值,所以tmp在記憶體中儲存的時候是一個任意值,而我們又解引用,跳到這個任意值上對它進行修改,這是不被允許的,所以程式奔潰。野指標:沒有訪問許可權的地址(指標)
void Swap(int *p1,int *p2)
{
	int tmp;
	tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
因為在Swap3中我們定義了一個野指標,那我們現在就不用野指標,定義這個指標作用就是接下來儲存a的值,那我們就定義一個整形變數儲存a的值,*p1也就相等於a,*p2也就相當於b這時候兩者進行交換就成功交換了,在main中也被交換了。總結:
當一個函式想要影響另一個函式時,我們要有兩個條件(1)進行指標傳參(2)要對指標進行解引用