关泊兰在笑 2020-11-15 11:29 采纳率: 100%
浏览 97
已采纳

一个初学c语言指针的小白的问题:关于两指针指向的交换

引子:要写一个函数来交换俩变量a和b的值,可以定义指向a的指针pa,和指向b的指针pb,此时便可以向调用函数中传递地址,函数中的形参根据地址进行运算就可以直接影响实参。
具体实现函数可以为:

void swap(int *p1,int *p2)

{

int box;

box=*p1;

*p1=*p2;

*p2=box;

}

运行时,实参pa,pb的值被复制传给形参p1,p2  

借助取值运算符“*”,swap函数便可根据形参中的地址直接访问a和b,从而直接交换了俩实参的值。
 

同理,如果要写一个函数来交换上述两个已被赋值的指针pa和pb的指向(使pa指向b,pb指向a),即交换两个指针变量的值,需要用指针的指针来对指针变量自身的地址进行传递,
按照如上操作方法,实现的函数应该为:

void swap(int **p1,int **p2)

{

int box;

box=**p1;

**p1=**p2;

**p2=box;

}

但是如果把函数写为如下,也可以达到交换指针变量pa,pb值的效果:

void swap(int **p1,int **p2)

{

int *box;

box=*p1;

*p1=*p2;

*p2=box;

}
我的问题来了:

这个函数操作,难道不是只对形参(*p1)和形参(*p2)进行了值的交换而并未影响到实参吗,但实际上这个函数已经达到目的了,为什么?

  • 写回答

1条回答 默认 最新

  • 日不落的希望 2020-11-15 15:07
    关注

    先看前两个程序都是实现指针指向内存的值的交换,注意第三个交换的是什么。函数参数是双层指针(int **p,p是一个指针变量,指向一个指针,指针指向int类型变量)。所以box指针接收的*p1是指针,交换了*p1和*p2的指向。并没有值的交换。

    你还可以尝试一下:

    void swap(int **p1,int **p2)

    {

    int *box;

    box=p1;

    p1=p2;

    p2=box;

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 求友友们解惑,感激不尽
  • ¥15 python中aiohttp.client_exceptions.ContentTypeError
  • ¥30 DeepLung肺结节检测生成最大froc值对应的epoch报错
  • ¥15 信号发生器如何将频率调大,步尽值改成10
  • ¥15 keil 5 编程智能家具,风扇台灯开关,人体感应等
  • ¥100 找一名渗透方面的专家
  • ¥20 使用Matlab APP设计一个插补小程序
  • ¥15 evo评估时曲线出现问题
  • ¥15 eNSP拓扑图配置实验
  • ¥20 有没有兄弟会替换fmod studio的.bank文件内的音效?