1. 程式人生 > >子函式修改父函式的值

子函式修改父函式的值



//子函式要想修改父函式的值,必須要①傳指標【例程式碼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;
}