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