-1

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

4

4 回答 4

2

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

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

于 2012-04-26T13:53:30.167 回答
1

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

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

注意与号

于 2012-04-26T13:52:17.127 回答
0

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

于 2012-04-26T13:55:12.443 回答
0

您跳过的程序部分可能有这一行:

using namespace std;

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

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

using声明将所有符号都std带入范围。具体来说,它引入了std::swap. swapmain调用中的行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;
}
于 2012-04-26T15:28:57.900 回答