接下來的這個其實不是我要說明,而是留給各位思考,這個問題並不會太難或是太複雜...現在再次考慮 SWAP_A 的副函式,只是我寫的方式換了
原本的:
// ====================================
void Swap_A(int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
換個方式:
// ====================================
void Swap_A(int *a, int *b)
{
int *c;
c = a;
a = b;
b = c;
}
請問有什麼差別嗎?出來結果會一樣嗎?
留下程式碼讓各位測試看看...
程式碼:
// ====================================
// FileName: CallByAddress2.cpp
// Author : Edison.Shih.
// Complier: VC 2008
#include <stdio.h>
// ====================================
void Swap_A(int *a, int *b)
{
int *c;
printf("\n=== swap_A function initial ===\n");
printf(" *a = %6d, *b = %6d\n", *a, *b);
printf(" a = %06X, b = %06X\n", a, b);
c = a;
a = b;
b = c;
printf("\n=== swap_A function swap end ===\n");
printf(" *a = %6d, *b = %6d\n", *a, *b);
printf(" a = %06X, b = %06X\n", a, b);
}
// ====================================
int main(int argc, char **argv)
{
int a=10;
int b=5;
printf("\n *=== before swap in main ===* \n");
printf(" a = %6d, b = %6d\n", a, b);
printf("&a = %06X,&b = %06X\n", &a,&b);
Swap_A(&a, &b);
printf("\n *=== after swap in main ===* \n");
printf(" a = %6d, b = %6d\n", a, b);
printf(" &a = %06X, &b = %06X\n", &a,&b);
return 0;
}

a, b的值並未改變 而*a, *b的值交換了(指向的位址值交換)?
前半段說對了,後半段觀念似乎不夠正確,再想想.提示: int b; int *a;// pointer to int, 存的是變數的位置 int a = &b; printf("%x %x", a, &b); //發現a所存的值,就是b的位置 再想一下,明天晚飯吃完還沒想出來再留言給我,我再回你。
function裡的副函a, b存的是主函a, b的位址值 執行完運算,副函a, b存的值交換(主函a, b的位址值交換) 所以印出副函*a, *b的值交換,但結束function後 印出主函a, b的值不變。 如此?
Bingo!! 後面我再補充好了,方便說明把副函式的引數名稱換一下。事實上用Swap_A(&a, &b); 呼叫 SWAP_A(int *sub_a, int*sub_b) 時,os 仍會先配置二個記憶體位置給副函式的 sub_a, sub_b用。假設 a=5, &a=0x00, b=10, &b=0x20; 那麼在呼叫時 sub_a "存的值" 是 a 的位置,也就是 0x00, sub_a "本身的位置值" 本身沒太大意義;同理,sub_b 也一樣。而整個副函式在做的,只是做 sub_a 和 sub_b 內容的交換,就是把他們二個存的 a,b 的位置值交換,實際上的確如你所說,a,b值不變,待 sub-func 結束後, sub_a, sub_b 的記憶體空間又被收回去,於是這隻副函式根本就是 pass by value, 而不是 pass by pointer. 恭喜你功力大增!!