为什么第1个代码引入一个新的变量是可以正常运行的,第2个代码引入一个新的指针,让指针内容交换不可以。
为什么指针内容的交换一定要再引入一个变量
为什么第1个代码引入一个新的变量是可以正常运行的,第2个代码引入一个新的指针,让指针内容交换不可以。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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的值 } //综上所述,想通过调用函数改变某变量的值,则形参中需要有该变量的指针
如果对本回答有疑问,欢迎在回答下方评论!
如果本回答成功帮到你,麻烦动动手指点个采纳,谢谢啦~本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥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仿真