为何main函数中int i与int j的值未实现交换?
问题核心:你交换的是指针的指向,不是变量的值
你的swap函数并没有修改i和j这两个变量内存中的实际值,而是交换了指针变量p和q的指向。
具体分析
在main里,p初始指向i(&i),q初始指向j(&j)。调用swap((void **)&p, (void **)&q)时,你把p和q的地址传给了swap的a和b参数:
*a就是p的值(也就是&i),*b就是q的值(也就是&j)- 你在
swap里执行t=*a; *a=*b; *b=t,本质是把p的值改成&j,q的值改成&i——这只是让p和q互相指向了对方的变量,但i和j本身的内存数据(3和5)完全没被修改。
你在swap里打印的*a和*b地址变化,其实是p和q的指向变了,而i和j的地址(&i、&j)从始至终都没改变过,它们的值自然也不会变。
要交换i和j的值,该怎么改?
如果你目标是交换i和j的实际值,有两种简单方式:
方式1:直接交换int变量的内容(最直观)
#include <stdio.h> void swap(int *a, int *b) { int t = *a; *a = *b; *b = t; } int main() { int i = 3; int j = 5; printf("-org i = %d , j = %d\n",i,j); swap(&i, &j); // 传递i和j的地址 printf("-mod i = %d , j = %d\n",i,j); return 0; }
方式2:如果一定要用void**(没必要,但可以实现)
如果你坚持要用void**的写法,需要在swap里解引用到int*,然后修改对应地址的内容:
#include <stdio.h> void swap(void **a, void **b) { // 先把void*转成int*,再交换它们指向的内容 int t = *(int*)*a; *(int*)*a = *(int*)*b; *(int*)*b = t; } int main() { int i = 3; int j = 5; int *p = &i; int *q = &j; printf("-org i = %d , j = %d\n",i,j); swap((void **)&p, (void **)&q); printf("-mod i = %d , j = %d\n",i,j); return 0; }
验证结果
修改后,main里打印的i和j就会变成5和3,达到你预期的交换效果。
内容的提问来源于stack exchange,提问作者陳連城
相关产品推荐
相关产品推荐

