int add(int a, int b) //函數傳參的時候使用了int整型數據,本身是數值類型。實際調用該函數時,實參將自己拷貝一份,並將拷貝傳遞給形參進行運算。實參自己實際是不參與運算的。所以在該函數中,實參本身是沒有得到改變的。
int main()
{
int x = 3, y = 5;
swap(x, y);
printf("x = %d ,y = %d\n",x, y); //交換失敗
swap_pointer(&x, &y);
printf("x = %d ,y = %d\n",x, y); //交換成功
}
int swap(int a, int b) //C語言中,函數調用時,實參傳遞給形參實際是傳值調用。也就是說,實參x和y將自己的值拷貝一份傳給形參 a 和 b;因此在函數swap中實際得到交換的是 a 和 b,而不是實參 x 和 y,因此函數執行完后,x和y的值依然沒有改變。
{
int temp;
temp = a; //a是swap里邊的形參,實際調用時得到的是實參x的一份拷貝,只是和x的值相等而已,其他並無任何關聯,因此在這里不能訪問到實參x
a = b;
b = temp;
return 0;
}
int swap_pointer(int *p1, int *p2) //C語言函數調用時,一直都是傳值調用。也就是說實際傳遞的一直都是實參的拷貝,但是在本函數中的形參和實參都不是x和y,而是x和y的地址值。這樣的話,就讓我們在調用函數里通過間接訪問*p的方式,訪問到了函數外部的實參。 //(如果不使用指針,再調用函數內部只能訪問到形參,無法訪問到函數外部的實參)
{
int temp;
temp = *p1; //實際調用時,p1得到的實參是x的地址&x,所以*p1代表的就是x
*p2 = *p1;
*p1 = temp;
return 0;
}