无法更改函数中的值

时间:2012-01-24 15:24:46

标签: c++

我开始发展,抱歉这个新手问题。

我需要创建一个在2个变量之间交换值的函数。

我已经编写了这段代码,但是没有对变量进行任何更改,我应该更改什么?我的错是什么?

#include <iostream>
using namespace std;

void swap_values( int x, int y);
int main(void) {
   int a,b;    
   a = 2;   
   b = 5;  
   cout << "Before: " << a << " " << b << endl; 
   swap_values( a,b );   
   cout << "After: " << a << " " << b  << endl;   
}  
void swap_values( int x, int y ){
   int z;
   z = y;
   y = x;
   x = z;
}

3 个答案:

答案 0 :(得分:10)

您需要通过引用传递变量:

void swap_values( int& x, int& y )
{
   int z;
   z = y;
   y = x;
   x = z;
}

pass-by-valuepass-by-reference是主要编程语言中的关键概念。在C ++中,除非您指定by-reference,否则会出现pass-by-value

它基本上意味着它不是传递给函数的原始变量,而是复制。

这就是为什么在函数之外,变量保持不变 - 因为在函数内部,只修改了副本。

如果您通过引用(int& x, int& y)传递,则该函数对原始变量进行操作。

答案 1 :(得分:1)

您需要了解默认情况下,C ++使用按值调用的调用约定。

当您调用swap_values时,其堆栈帧会接收作为参数传递给它的值的副本。因此,参数int x, int y完全独立于调用者和变量int a, b

幸运的是,C ++还支持call-by-reference(参见维基百科或者关于它的优秀编程语言设计教科书),这实际上意味着函数中的变量绑定到(或别名)调用者中的变量(这是一种粗略的简化)。

call-by-reference的语法是:

void swap_values( int &x, int &y ){
    // do your swap here
}

答案 2 :(得分:0)

你正在经历价值。你仍然可以通过值传递,但需要使用指针。

这是正确的代码:

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

void main() {
   int a = 23, b = 47;
   printf("Before. a: %d, b: %d\n", a, b);
   swap(&a, &b);
   printf("After . a: %d, b: %d\n", a, b);
}

也是一个小文件,解释“按引用”与“按价值”:http://www.tech-recipes.com/rx/1232/c-pointers-pass-by-value-pass-by-reference/