子函式修改父函式的值
//子函式要想修改父函式的值,必須要①傳指標【例程式碼1】 ②解引用【例程式碼2】
//但傳指標解引用也不一定能成功修改,因為可能有野指標【例程式碼3】
/*
//【程式碼1】 :輸出結果為 10,20
//【因為沒有傳指標,則Swap_err1函式中的ab和main函式中的ab並不相等,所以列印的是main函式中未交換的ab值】
#include <stdio.h>
void Swap_err1(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap_err1(10,20);
printf("%d,%d\n",a,b);
return 0;
}
*/
/*
//【程式碼2】 :輸出結果為 10,20
//有傳指標但沒有解引用
#include <stdio.h>
void Swap_err2(int *p1,int *p2)
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
int main()
{
int p1 = 10;
int p2 = 20;
Swap_err2(&p1,&p2);
printf("%d,%d\n",p1,p2);
return 0;
}
*/
/*
//【程式碼3】 :編譯失敗
//傳指標解引用但有野指標*tmp,野指標則訪問不了
#include <stdio.h>
void Swap_err3(int *p1,int *p2)
{
int *tmp = *p1;
*p1 = *p2;
*p2 = *tmp;
}
int main()
{
int p1 = 10;
int p2 = 20;
Swap_err3(&p1,&p2);
printf("%d,%d\n",p1,p2);
return 0;
}
*/
//【正確】:輸出結果為 20,10
//相當於int *a=&p1; *a=p1=10
#include <stdio.h>
void Swap(int *p1,int *p2) //Swap_err2(int *a,int *b)
{
int tmp = *p1; //tmp = *a
*p1 = *p2; //*a = *b;
*p2 = tmp; //*b = tmp;
}
int main()
{
int p1 = 10;
int p2 = 20;
Swap(&p1,&p2);
printf("%d,%d\n",p1,p2);
return 0;
}