C ++指针将值传递给函数并忽略cin操作

时间:2012-04-26 13:50:13

标签: c++ function pointers cin

我正在尝试使用指针并创建了这个示例,我不明白为什么这不起作用。有人可以解释为什么当我在没有引用的情况下传递值时函数不执行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 B:0

4 个答案:

答案 0 :(得分:2)

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

如果你传递指向整数的指针 - 即swap(&a, &b),它会起作用 - 但我认为你已经理解了这个情况。

答案 1 :(得分:1)

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

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

注意&符号

答案 2 :(得分:0)

实际应该是swap(&a,&b)。总是有一个指针的引用,你的指针p1和p2实际上并没有引用任何有效的位置。

答案 3 :(得分:0)

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

using namespace std;

它也可能有这一行,这是必需的:

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

using声明会将std中的所有符号带入范围。具体来说,它会带来std::swapswap中的main行会调用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;
}