【C语言】两个变量值的交换——指针

     C语言中交换两个变量的值可以在主函数中直接实现,也可以通过子函数来实现。下面我们介绍用子函数实现的情况。
    1.将两个变量的值作为实参直接传递,在子函数内部定义一个普通变量来对两个形参进行交换,并分别在子函数和主函数中打印。
#include <stdio.h>  

void Swap(int a,int b)
{
    int tmp = a;
    a = b;
    b = tmp;
    printf("a=%d,b=%d\n",a,b);
}  
  
int main()
{
    int a = 5;
    int b = 10;
    printf("a=%d,b=%d\n",a,b);
    Swap(a,b);
    printf("a=%d,b=%d\n",a,b);

    return 0;
}
      下面是程序的运行结果:
     从程序的运行结果我们可以看出,在子函数内部两个形参是交换成功了的,但是在主函数中却没有。那是为什么呢?我们进入函数内部来看下。
     下面是主函数中a和b的地址及值:
      下面是子函数中a和b的地址及值:
       可以看出主函数和子函数中a和b的地址不相同,即说明了两个函数中的变量不是同一个,仅仅是同名而已。这说明了两个形参已交换成功,但并未传递给实参,两个实参的值并未发生改变。
      2.第一种方法中两个实参并未发生改变,因为其地址并未传递给形参。接下来我们把实参的地址传递给形参,并且定义一个指针变量来对两个形参进行交换,并分别在子函数和主函数中打印。
#include <stdio.h>  

void Swap(int *p1,int *p2)
{
    int *tmp = p1;
    p1 = p2;
    p2 = tmp;
    printf("a=%d,b=%d\n",*p1,*p2);
}

int main()
{
    int a = 5;
    int b = 10;
    printf("a=%d,b=%d\n",a,b);
    Swap(&a,&b);
    printf("a=%d,b=%d\n",a,b);

    return 0;
}  
     下面是程序的运行结果:
     可以看出结果还是同样错误。我们进行测试。
     下面是主函数中a和b的地址及值:

    下面是子函数中a,b,p1,p2的地址及值:

    下面是返回到主函数中四个变量的地址及值:


      以上测试结果可以说明主函数在给子函数传参时,传的是主函数中的两个变量的地址,但是在子函数中只是把形参p1和p2所指向的变量的地址进行交换,开始p1指向a,p2指向b,交换之后, p1指向b,p2指向a,没有实质性的将实参a,b的值交换。然后返回到主函数中,a和b依然是原来的值,没有交换。
     3.下面在子函数中将实参值进行交换。
#include <stdio.h>  

void Swap(int *p1,int *p2)  
{  
    int *tmp;  
    *tmp = *p1;  
    *p1 = *p2;  
    *p2 = *tmp; 
    printf("a=%d,b=%d\n",*p1,*p2);  
}  
  
int main()  
{  
    int a = 5;  
    int b = 10;  
    printf("a=%d,b=%d\n",a,b);  
    Swap(&a,&b);  
    printf("a=%d,b=%d\n",a,b); 

    return 0;  
}
    以上方法看似没有错误,但是在运行时程序却会崩溃:
    上边显示,变量tmp正在被使用却没有被初始化。这种没有被初始化的指针称为野指针,也叫悬挂指针。野指针是没有访问权限的地址(指针)。没有访问权限,形参不能正常交换,所以程序崩溃。
    4.下面才是正确的写法。
#include <stdio.h>  

void Swap(int *p1,int *p2)  
{  
    int tmp;  
    tmp = *p1;  
    *p1 = *p2;  
    *p2 = tmp;  
    printf("a=%d,b=%d\n",*p1,*p2);  
}  
  
int main()  
{  
    int a = 5;  
    int b = 10;  
    printf("a=%d,b=%d\n",a,b);  
    Swap(&a,&b);  
    printf("a=%d,b=%d\n",a,b);  

    return 0;  
}  

    由此可以总结出学习指针的一个重要知识点:一个函数的改变要影响另一个函数,两个条件:1.传指针;2.解引用。


猜你喜欢

转载自blog.csdn.net/PinkBananA_/article/details/80467583