关泊兰在笑 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 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效