C++指针将值传递到函数中并忽略 CIN 操作

C++ pointers passing values into a function and ignoring cin operations

本文关键字:CIN 操作 函数 指针 值传 C++      更新时间:2023-10-16

我正在试验指针并创建了此示例,我不明白为什么这不起作用。有人可以解释为什么当我在没有引用的情况下传递值时该函数不执行 cin 操作吗?

#included proper headers and stuff
...
int main()
{
    int a, b;
    swap(a,b);
    cout << "A: " << a << endl;
    cout << "B: " << b << endl;
    return 0;
}
void swap(int * p1, int *p2)
{
    cin >> *p1;
    cin >> *p2;
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

结果CIN被跳过答: 0乙: 0

呃。您正在预期指针的位置传递整数。swap()函数使用这些未初始化整数中的(随机垃圾)值作为机器地址,并将数据写入这些地址。当然,这不会改变你传递的整数中的值 - 它会改变内存中的其他随机位置。通常,此类程序会因违反分段而崩溃;你只是幸运(或不幸)。

如果您将指针传递给整数(即swap(&a, &b)),它会起作用,但我认为您已经了解这种情况。

您应该传递变量的地址,而不是变量本身。

int a, b;
swap(&a,&b);

注意与号

实际上应该是swap(&a,&b) .始终对指针有引用,您的指针 p1 和 p2 实际上并不引用任何有效位置。

您跳过的程序部分可能有以下行:

using namespace std;

它还可能有以下行,这将是必需的:

extern void swap(int * p1, int *p2);

using声明将std中的所有符号都纳入范围。具体来说,它带来了std::swap.main中的swap行调用std::swap(int&, int&)而不是预期的。

此错误因您错误地调用自己的交换而变得更加复杂。如果要调用您的交换,您必须 a) 在使用前声明它,并且 b) 正确调用它。

试试这个程序:

#include <iostream>
extern void swap(int*, int*);
int main()
{
    int a, b;
    swap(&a,&b);
    std::cout << "A: " << a << "n";
    std::cout << "B: " << b << "n";
    return 0;
}
void swap(int * p1, int *p2)
{
    std::cin >> *p1;
    std::cin >> *p2;
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}