子函数的改变能够影响到父函数,一定要传指针和解引用,两个条件缺一不可
在这里以一个简单的主函数数值交换来演示如何来通过功能函数来影响主函数,并给出一些错误例证
void Swap_err1(int a,int b)//error1
{
int tmp = a;
a = b;
b = tmp;
//printf("%d,%d\n",a,b);
}
在没有学习指针部分时,我们可能会天真的认为直接从功能函数中交换数值能达到目的,而事实上,只能交换两个形参数值而已,并不能交换两个实参的数值
void Swap_err2(int *p1,int *p2)//没有解引用
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}
那么第二个错误也是以后尤其需要注意的,只交换了两个变量的地址,却没有交换两个变量对应的数值
void Swap_err3(int *p1,int *p2)
{
int *tmp; //野指针,悬挂指针
*tmp = *p1;
*p1 = *p2;
*p2 = *tmp;
}
第三个错误在一开始,这样程序会崩溃,所谓野指针就是没有访问权限的指针,我们未给*tmp初始化,所以它是一个随机地址,那么这个随机地址对应的变量是我们没有访问权限的,自然程序会崩溃
void Swap(int *p1,int *p2)//ok
{
int tmp;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
这个就是正确的代码,那么注意tmp是一个普通变量,*p1是解引用后也是一个普通变量,那么可以赋值,而指针变量和普通变量是不能辅助或者画等号的,因为类型不匹配。
int main()
{
int a = 10;
int b = 20;
printf("a=%d,b=%d\n",a,b);
Swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}