为什么不能交换实参 void Swap3(int *p1, int *p2) { int *p; *p = *p1; *p1 = *p2; *p2 = *p; }
时间: 2024-07-13 22:01:21 浏览: 126
这个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;
}
```
相关问题
函数的功能是交换变量a和b的值,且能返回交换的结果,正确的函数是()。 A. void swap(int *a, int *b) { int *p; *p=*a; *a=*b; *b=*p; } B. void swap(int a, int b) { int t; t=a; a=b; b=t; } C. void swap(int *a, int *b) { int *p; p=a; a=b; b=p; } D. void swap(int *a, int *b) { int t; t=*a; *a=*b; *b=t; }
正确的函数是D. void swap(int *a, int *b) { int t; t=*a; *a=*b; *b=t; }。
解析:
A选项中,定义了一个指针p,但并没有为它分配内存,在执行“*p=*a”时会出现未定义的行为,导致程序出错。
B选项中,参数a和b是按值传递的,函数中对它们的修改不会影响到函数外部的实参,因此无法实现交换变量的功能。
C选项中,定义了一个指针p,但在执行“p=a”时只是把指针p指向了a所指向的内存地址,而没有实现变量a和b的值的交换。
D选项中,定义了一个临时变量t,将a所指向的值赋给t,再将b所指向的值赋给a,最后将t的值赋给b,实现了变量a和b值的交换。同时,函数返回值为void,即没有返回值,符合题目要求。
因此,选项D是正确的函数。
"int" 类型的实参与 "int *" 类型的形参不兼容
在C++中,`int` 类型的实参和 `int *`(指向整数的指针)类型的形参并不直接兼容。当你尝试将一个 `int` 值传递给一个 `int *` 参数时,这并不是简单的类型匹配,而是涉及到值传递和指针的解引用。
具体来说,如果你有一个 `int` 变量并试图将其作为参数传递给接受 `int *` 的函数,通常会创建一个新的临时变量来存储原始 `int` 的地址,然后将该地址传递给函数。这样做的原因是,`int` 类型不能直接赋值给 `int *`,因为这不是一种基本类型的隐式转换。这是通过类型转换运算符实现的[^1]:
```cpp
struct A {
explicit operator int const { return 0; } // 显式类型转换用于此情况
};
void function(int* ptr) {
// 实际上不会直接使用传入的 int,而是通过指针访问其值
}
// 调用时会这样做 (假设 a 是一个 int 变量)
function(&a); // 将 a 的地址作为 int* 传递
```
因此,"int" 类型的实参与 "int *" 类型的形参之间的兼容性涉及的是间接的转换过程,而非简单的类型匹配。
阅读全文