子函数的改变要能影响到父函数

子函数要想影响父函数首先要传指针再解引用
void Swap_err1(int a,int b)//error
{
int tmp = a;
a = b;
b = tmp;
}
Swap_err1函数显然没有传指针,只是传了a和b的值,则此函数的作用仅仅是在子函数中把两个数值进行了交换并不能影响到主函数的值。


void Swap_err2(int *p1,int *p2)//error
{
int *tmp = p1;
p1 = p2;
p2 = tmp;
}

Swap_err2函数首先传了指针但没用对指针解引用,所以这个函数的作用只是将两个指针的指向改变。两个指针的指向发生改变并不能影响到主函数,必须要经过解引用才能实现两个数值交换。


void Swap_err3(int *p1,int *p2)//error
{
int *tmp;//野指针,悬挂指针 
*tmp = *p1;//崩溃
*p1 = *p2;
*p2 = *tmp;
}
Swap_err3函数主要问题是定义了一个野指针,野指针也就是指向不可用内存区域的指针。通常对这种指针进行解引用的话,将会使程序发生崩溃。


void Swap(int *p1,int *p2)
{
  int tmp;             //先定义一个整形变量
  tmp = *p1;       //用这个整形变量来保存整形指针*p1保存的值,*p1通过解引用到主函数中把a的值赋值给tmp
  *p1 = *p2;         //*p1和*p2通过借引用从而使子函数和主函数链接起来*p1 = *p2相当于a=b
  *p2 = tmp;       //*p2通过解引用*p2 = tmp相当于b=tmp,tmp由于第一步交换tmp=a则b=a
}

Swap函数首先传了指针然后解引用所以子函数中可以影响到父函数的值


A函数调用B函数,则A称为父函数,B称为子函数
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}

猜你喜欢

转载自blog.csdn.net/L_jiahao/article/details/79600742