wind414 2023-01-18 16:44 采纳率: 82%
浏览 40
已结题

为什么指针内容的交换一定要再引入一个变量

img

img


为什么第1个代码引入一个新的变量是可以正常运行的,第2个代码引入一个新的指针,让指针内容交换不可以。

  • 写回答

3条回答 默认 最新

  • 花辞树dor 2023-01-19 12:02
    关注

    两个变量的值进行交换时,需要用到一个临时变量储存其中一个变量的值。
    那为什么第二段代码没有达到预期效果呢?用下面的代码结合注释进行解释。

    #include <stdio.h>
    
    void fun1(int* m, int* n);
    void fun2(int* m, int* n);
    void fun3(int** m, int** n);
    
    int main()
    {
        int a = 1, b = 2; //a、b是整型变量
        printf("调用fun1前,a=%d,b=%d\n", a, b);
        fun1(&a, &b);
        printf("调用fun1后,a=%d,b=%d\n", a, b);
        int* pa = &a, * pb = &b; //pa、pb是整型指针变量
        printf("调用fun2前,pa=%p,pb=%p\n", pa, pb);
        fun2(pa, pb);
        printf("调用fun2后,pa=%p,pb=%p\n", pa, pb);
        int** ppa = &pa, ** ppb = &pb; //ppa、ppb是整型的二级指针变量(储存指针的地址)
        printf("调用fun3前,pa=%p,pb=%p\n", pa, pb);
        fun3(ppa, ppb); //或fun3(&pa, &pb);
        printf("调用fun3后,pa=%p,pb=%p\n", pa, pb);
        return 0;
    }
    //首先要明白,函数调用过程中,改变形参的值并不会影响实参的值
    void fun1(int* m, int* n) //形参是a,b的指针
    {
        int t; //整型的值的交换
        t = *m;
        *m = *n;
        *n = t; //虽然m,n是形参,但对m,n用*进行解引用,间接访问a、b的地址,修改了a、b的值
    } //由此可知,要调用函数改变实参a、b的值,形参中要有它们的指针
    
    void fun2(int* m, int* n) //形参是a,b的指针
    {
        int* t; //整型指针的值的交换
        t = m;
        m = n;
        n = t; //形参的值交换了,但是没有间接访问pa、pb的地址,所以它们的值不会改变
    } //根据fun1的例子可知,要调用函数改变实参pa、pb的值,
      //形参中要有它们的指针,也就是指针的指针(二级指针)
    
    void fun3(int** m, int** n)
    {
        int* t; //整型指针的值的交换
        t = *m;
        *m = *n;
        *n = t; //虽然m,n是形参,但对m,n用* 进行解引用,间接访问pa、pb的地址,修改了pa、pb的值
    } //综上所述,想通过调用函数改变某变量的值,则形参中需要有该变量的指针
    
    

    img

    如果对本回答有疑问,欢迎在回答下方评论!
    如果本回答成功帮到你,麻烦动动手指点个采纳,谢谢啦~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月27日
  • 已采纳回答 1月19日
  • 创建了问题 1月18日

悬赏问题

  • ¥15 yolov8边框坐标
  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真