为什么不能交换实参 void Swap3(int *p1, int *p2) { int *p; *p = *p1; *p1 = *p2; *p2 = *p; }
时间: 2024-07-13 14:01:21 浏览: 117
这个Swap3函数试图通过临时变量`p`来进行两个指针`p1`和`p2`指向的整数的交换。然而,这段代码有一个逻辑错误。当它将`*p`赋值给`*p1`,然后又将`*p1`赋值给`*p2`时,实际上`p`并没有改变,因此`*p`始终指向的是最初的`p1`所指向的值。所以,最后的结果是三个指针都指向了原始`p1`的值,而不是预期的交换结果。
正确的做法应该是直接操作指针本身,例如:
```c
void Swap3(int *p1, int *p2)
{
int temp;
temp = *p1; // 或者 temp = *p;
*p1 = *p2;
*p2 = temp; // 这里是temp,不是*p
}
```
或者更简洁地使用算术运算:
```c
void Swap3(int *p1, int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
```
相关问题
编写程序,定义一个函数void swap(int* p1,int* p2),该函数能实现两个变量的数值交换。主函数中定义两个整型变量,a,b,从键盘获取任意整型值给a,b,并在屏幕上打印其值,然后调用void swap(int* p1,int* p2)函数,实现a,b的值交换(提示,调用swap函数时,实参应该传入分别指向a和b的指针)。最后在主函数中将交换了值的a和b在屏幕上再次显示出来。
下面是实现该程序的代码:
```c
#include <stdio.h>
void swap(int* p1, int* p2) {
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
int main() {
int a, b;
printf("请输入两个整数:\n");
scanf("%d %d", &a, &b);
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("交换后:a = %d, b = %d\n", a, b);
return 0;
}
```
程序中定义了一个`swap`函数,该函数接受两个指针参数,用于交换这两个指针所指向的变量的值。在主函数中,先从键盘获取两个整数,然后调用`swap`函数进行交换,最后输出交换后的结果。
上机编程实现用函数将从键盘上输入的三个数按从小到大的顺序输出。要求编写自定义函数swap() 用于交换两个变量的值;且函数的原型为: void swap(int *p1,int *p2); 并在main函数中用指针变量作实参,调用swap函数,最后输出排序后的结果。
好的,这是一个经典的排序问题,以下是代码实现:
```
#include <stdio.h>
void swap(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main() {
int a, b, c;
printf("请输入三个数:");
scanf("%d %d %d", &a, &b, &c);
if (a > b) swap(&a, &b);
if (a > c) swap(&a, &c);
if (b > c) swap(&b, &c);
printf("从小到大排序后的结果为:%d %d %d\n", a, b, c);
return 0;
}
```
这个程序中,我们定义了一个自定义函数swap(),用于交换两个变量的值。在main函数中,我们先输入三个数,然后通过比较大小,调用swap函数交换变量的值,最终输出排序后的结果。
阅读全文