为何在exchange函数内调用swap无法交换a和b,直接调用却可行?
问题原因分析
核心问题出在函数参数的副本传递机制以及swap函数的作用对象上:
1. 两种场景的本质差异
假设你的目标是交换两个char变量x和y的实际值:
operation2:直接调用
swap(&x, &y)能生效,说明你的swap函数逻辑是通过指针修改目标变量的内存内容,比如标准实现:void swap(char *a, char *b) { char temp = *a; *a = *b; *b = temp; }调用时传入
x和y的地址,swap直接操作*a和*b(也就是x和y的内存),自然能完成交换。operation1:自定义的
exchange函数接收char *a和char *b作为参数,内部调用swap(a,b)却无法生效,原因在于:
当你调用exchange(&x, &y)时,a和b是传入指针的局部副本——它们是exchange函数内部的独立变量,值等于&x和&y,但和主函数里的原始指针(或x、y的地址)没有关联。
如果你的swap函数是用来交换指针变量本身的值(而非指针指向的内容),比如错误实现:void swap(char *a, char *b) { char *temp = a; a = b; b = temp; }那
swap(a,b)只会交换exchange内部a和b的指向,完全不会影响主函数里的x和y,所以交换无效。
2. 关键结论
- 函数参数传递时,指针本身也是按值传递的,函数内部拿到的是指针的副本,修改副本不会影响外部的原始指针。
- 要实现目标变量的交换,必须确保操作的是指针指向的内存内容,而非指针变量本身。
内容的提问来源于stack exchange,提问作者Dolores
相关产品推荐
相关产品推荐

