【问题标题】:Simple C++ swap function简单的 C++ 交换函数
【发布时间】:2015-02-07 23:05:16
【问题描述】:

为什么如果我有这样的函数,交换两个数字,它不起作用[swap],(我知道我可以通过在原型中声明指针来做到这一点,然后传递main()) 中的各个变量,但适用于数组,无需传递指针和地址。

没用

void num_exchange(int m, int n);

int main(){

int num1 = 5;
int num2 = 6;

num_exchange(num1 , num2 );

cout << "num1 =" << num1 << endl;
cout << "num2 =" << num2 << endl;

return 0;
}

void num_exchange(int m, int n){
int temp;
temp = m;
m = n;
n = temp;
}

作品

void arr_exchange(int [], int);

int main(){


int n[7] = { 0, 0, 0, 0, 0, 0, 0 };

arr_exchange(n, 7);
for (int i = 0; i < 7; i++)
    cout << n[i] << " ";

return 0;
}

void arr_exchange(int x[], int){
for (int i = 0; i < 7; i++)
    x[i] = 1;
}

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:
    void num_exchange(int m, int n){
    int temp;
    temp = m;
    m = n;
    n = temp;
    }
    

    修改输入整数的副本。要使您的代码正常工作,请使用

    void num_exchange(int& m, int& n){
    int temp;
    temp = m;
    m = n;
    n = temp;
    }
    

    代替(注意第一行中的&amp;)。这称为引用传递。一般来说,使用std::swap来交换东西。

    void arr_exchange(int x[], int){
    for (int i = 0; i < 7; i++)
        x[i] = 1;
    }
    

    因为在 C++ 中有效

    void arr_exchange(int x[], int){
    

    等价于

    void arr_exchange(int* x, int){
    

    所以这里传递了一个指针,从而修改了原始数据。

    【讨论】:

    • @dotman14 您不能将数组传入或传出函数,因此这是数组名称衰减为指向其第一个元素的指针的上下文之一。如果函数的签名只是一个“商品”,则括号表示法。
    • @dotman14 确实如此。但是,您可以传递对数组的引用:template &lt;std::size_t N&gt; void fun (int (&amp;a)[N]) {。这里,既没有传递指针也没有传递指针的引用,你可以在函数中像真正的数组一样使用a(在某种意义上比指针更好)。
    【解决方案2】:

    您的 num_exchange() 按值获取其参数,即,它看到原始值的副本。交换它们时,会交换副本,但不会触及原件。当您交换数组时,将传递指向数组 start 的指针(内置数组永远不会直接在 C++ 中复制)。由于指针引用的是原始数组而不是本地副本,因此交换数组元素会导致更改可见,即使在函数退出时也是如此。

    要将实际的原始对象传递给您的 num_exchange() 函数,您也可以使用指针,或者使用引用,例如:

    void num_exchange(int& m, int& n) {
        // ...
    }
    

    当然,交换元素最简单的方法是使用标准或类型提供的swap() 函数,尽管不可否认,由于额外的using-directive,使用起来有点尴尬:

    using std::swap;
    swap(num1, num2);
    

    【讨论】:

      【解决方案3】:

      函数默认按值调用

      发生函数调用时会发生什么???

      当函数调用发生时,程序中下一条指令的地址被压入堆栈,这会告诉编译器在函数参数(5 和 6)被压入堆栈后函数执行后返回的位置。 在函数内部,这些参数从堆栈中弹出,即 m=5,n=6 这意味着实际参数 (num1,num2) 没有改变。 然后使用 num1(i.e. m) 和 num2(i.e. n) 的别名执行该函数,执行后将地址从堆栈中弹出以从其离开的位置继续执行。

      在C语言中,解决这个问题的方法是传递num1、num2的地址,并使用指向内部函数的指针来指向它们。

      CPP 添加了新概念,称为引用。引用是变量的另一个名称。

      int & n1 = num1;
      int & n2 = num2;
      

      为什么它适用于数组??

      复制整个数组是不可行的,因此数组总是通过引用传递。数组的基址被传递给函数,因此在函数中对数组所做的任何修改都会影响实际数组。 p>

      【讨论】:

        【解决方案4】:

        您要查找的代码需要两个指针,因为该函数将复制您提供给它们的数据:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-25
          相关资源
          最近更新 更多