【C语言】利用指针实现a,b数值交换(swap),指针程序易错改正(程序注释详细)

目录

swap数值交换方法:

改进后的change3算法:


swap数值交换方法:

change2()与change3()方法正确,change1()为错误实例演示,运行程序可以看到指针指向地址数值,从而理解错误原因。(change3为改进算法)

#include <stdio.h>
#include <stdlib.h>

//int *p1,*p2,*p3;

int main()
{
    void change1(int *b1,int *b2);//声明函数
    void change2(int *b1,int *b2);//声明函数
    void change3(int *b1,int *b2);//声明函数
    printf("pointer!\n");

    int a1,a2,a3;
    a1=1; a2=2; a3=3;

    int *p1,*p2,*p3=&a3;
//p3=&a3;
    p1=&a1;
    p2=&a2;

    printf("未互换地址时p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
    printf("----------------------------------------\n");
    printf("错误实例,仅改指针b1,b2值,p1,p3并未变\n");
    printf("未互换P:%d,%d,%d\n",p1,p2,p3);
    change1(p1,p3);//等价change(&a1,&a3);
    printf("互换后P:%d,%d,%d\n",p1,p2,p3);
    printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);

    printf("----------------------------------------\n");
    
//使用改进实例需要将其余部分注释掉,因为全局变量和局部变量重名冲突了
//    printf("改正实例:既然是p1,p2没交换,最后更改以下即可\n");//需要定义指针为全局变量
//    printf("p1=b1,p3=b2\n");
//    printf("未互换P:%d,%d,%d\n",p1,p2,p3);
//    change3(p1,p3);//等价change(&a1,&a3);
//    printf("互换后P:%d,%d,%d\n",p1,p2,p3);
//    printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
//
//    printf("----------------------------------------\n");

    printf("正确实例:既然是a1,a2对象交换,函数就要进行对象的交换*p1,*p2\n");
    printf("p1->a1;temp=a1;p1=p2->a2;p2=temp->a1\n");
    printf("未互换P:%d,%d,%d\n",p1,p2,p3);
    change2(p1,p3);//等价change(&a1,&a3);
    printf("互换后P:%d,%d,%d\n",p1,p2,p3);
    printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);

    printf("----------------------------------------\n");

    return 0;
}

    void change1(int *b1,int *b2){
        int *b=NULL;//防止野指针
        b=b1;//b存b1存储的地址值
        b1=b2;
        b2=b;//b1 ,b2存储的地址值互换
        printf("互换后B:%d,%d\n",b1,b2);
    }

     void change3(int *b1,int *b2){
        int *b=NULL;//防止野指针
        b=b1;//b存b1存储的地址值
        b1=b2;
        b2=b;//b1 ,b2存储的地址值互换
        printf("互换后B:%d,%d\n",b1,b2);
        p1=b1;
        p3=b2;
        printf("互换后P:%d,%d\n",p1,p2);
    }

    void change2(int *b1,int *b2){
        int temp;//
        temp=*b1;//
        *b1=*b2;
        *b2=temp;//b1 ,b2存储的地址值互换
        printf("互换后B:%d,%d\n",b1,b2);


    }

改进后的change3算法:

#include <stdio.h>
#include <stdlib.h>

int *p1,*p2,*p3;

int main()
{
    
    void change2(int *b1,int *b2);//声明函数
    printf("pointer!\n");

    int a1,a2,a3;
    a1=1; a2=2; a3=3;

    //int *p1,*p2,*p3=&a3;
    p3=&a3;
    p1=&a1;
    p2=&a2;


    printf("----------------------------------------\n");
    
//使用改进实例需要将其余部分注释掉,因为全局变量和局部变量重名冲突了
    printf("改正实例:既然是p1,p2没交换,最后更改以下即可\n");//需要定义指针为全局变量
    printf("p1=b1,p3=b2\n");
    printf("未互换P:%d,%d,%d\n",p1,p2,p3);
    change3(p1,p3);//等价change(&a1,&a3);
    printf("互换后P:%d,%d,%d\n",p1,p2,p3);
    printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);

    printf("----------------------------------------\n");


    return 0;
}

     void change3(int *b1,int *b2){
        int *b=NULL;//防止野指针
        b=b1;//b存b1存储的地址值
        b1=b2;
        b2=b;//b1 ,b2存储的地址值互换
        printf("互换后B:%d,%d\n",b1,b2);
        p1=b1;
        p3=b2;
        printf("互换后P:%d,%d\n",p1,p2);
    }


【C语言】深入浅出谈指针:理解指针、指针定义和指针代码实例swap(代码详细注释,含易错实例以及改进办法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天很蓝~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值