2016-11-22 94 views
0

注意在代码中我没有使用指针,但我有一些概念,如果我要使用这个函数,当代码块完成时,该值将返回到正常值。交换函数 - 指针 - 混淆

但代码编译与实际上会用指针得到的答案。

我需要帮助,因为我很困惑,如果我有与指针有关的犯规概念。

void swap(int i, int j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

int main() { 
    int a = 110; 
    int b = 786; 
    cout << "Before swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 
    swap(a,b); 
    cout << "\nAfter swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 
    swap(a, b); 
    cout << "\nAnd back again swapping the value" << endl; 
    cout << "'a' stores the value : " << a << endl; 
    cout << "'b' stores the value : " << b << endl; 

    return 0; 
} 

I am getting results without using pointers - is this IDE problem

+2

什么是你的程序的实际输出?你期望输出什么?请修改您的问题以包含该问题。 –

+0

对不起,你声称''交换'工作或不工作,因为这是行不通的:http://ideone.com/xzGMcl,因为你传递的价值意味着它复制你的参数,并没有给他们分配任何新的价值 – EdChum

+0

也许尝试与宏交换:'#define swap(i,j)do {int temp = i; i = j; j = temp;} while(0)' – GPS

回答

3

看来您所包含的iostream标题还包含utility标题;并且您将std::swap的定义拉入您的程序。

既然你(没有显示它,但可能)在你的代码中有using namesapce std;,那么为swap设置的超载包含两个重载。并且通过重载分辨率的规则,调用正确的过载。


对于纠正一些定义,在这种情况下

+0

要改变函数名并检查它 –

+0

我在Visual Studio 2013中创建了一个项目,包括'iostream 'header和'using namespace std;'我不能重现OP的问题。交换不起作用,这是预测的行为。 – Philipp

+0

@菲利普,你不能假设任何标准头文件包含其他标题,除非标准保证它(在这种情况下它不包含)。例如,[GCC再现它](http://ideone.com/k19F60)。 – StoryTeller

6

swap功能将无法在main范围交换价值,因为ij函数的局部变量。要获得您期望的行为,您应该通过参考。

void swap(int& i, int& j) { 
    int temp = i; 
    i = j; 
    j = temp; 
} 

您的密码将为not actually swap the values

猜测
我认为你是using namespace std;,并从#include的一个从你与std::swap碰撞标准库。我认为该函数的std::版本在您的情况下被调用,这是您的代码似乎“工作”的唯一原因。

+0

这就是要点,这里是编译后的图片 - 它给了我完美的答案 - http://imgur.com/a/qc8jP –

+0

@BaqarHussain看到我的编辑。 – CoryKramer

0

如果你想使用指针交换,你应当经指针:

void swap(int *a, int*b) 
{ 
    int temp = *a; 
    *a = *b; 
    *b = temp; 
} 

按引用传递是另一种选择,为其他用户所指出的那样。

PS:您的查询与函数指针无关,所以我将从您的查询中删除函数指针标记。

+0

对不起,我忽略了这部分。 –

+0

我正常使用这个,出于好奇心,我删除了指针,并最终交换了值,这就是为什么我开始这个线程:) –