示例程序,swap_1和swap_2都是错误的,推理从1开始推到2,2没完成,推到3就完成了
# include <stdio.h> void swap_1(int, int); void swap_2(int *, int *); void swap_3(int *, int *); int main(void) { int a = 3; int b = 5; //swap_1(a, b); //这是错误的 //swap_2(&a, &b); // swap_2(*p, *q); 是错误的 swap_2(a, b); 也是错误的 swap_3(&a, &b); //OK printf("a = %d, b = %d\n", a, b); return 0; } //不能完成互换功能 void swap_1(int a, int b) //没有接收主函数的变量地址,这个a和b和主函数的a,b不是一个值,所以这里无论怎么改变,主函数都不变 { int t; t = a; a = b; b = t; return; } //虽然p接收了a的地址,q接收了b的地址,但是很可惜,你改变的是p和q的值,没有修改*p和*q的值,还是无法修改主函数的值 void swap_2(int * p, int * q) //这里的参数接受的变量是p和q,int * 表示接受参数的类型,也就是说应该接受地址 { int * t; //如果要互换p和q的值,则t必须是int *, 不能是int, 否则会出错 t = p; p = q; q = t; } //可以完成互换功能,改变了两个值,改变了a和b的值 void swap_3(int *p, int *q) { int t; //如果要互换*p和*q的值, 则t必须定义成int, 不能定义成int *, 否则语法出错 t = *p; // p是int *, *p 是int, *p是代表以p为地址代表的那个内容 *p = *q; // *p 刚好是a, *q刚好是b *q = t; }