交换数组中的2个项目,但不通过引用传递它

时间:2012-02-21 00:01:29

标签: c++ arrays

void swap(int a[], int size){
   ...............
}

int main(){
   int x[4] = {4,5,3,12} ;
   swap(x,4) ;
   // print array here - some elements are swapped
}

所以我不确定swap-function如何改变元素的顺序 因为void swap

按值传递

如果我这样做:void swap( int (&a)[], int size) 然后我的main函数中的原始数组会被更改,但是如果只是复制数组,交换函数如何交换元素,因此不应该对main中的数组产生任何影响?

4 个答案:

答案 0 :(得分:4)

作为函数参数传递时,不会复制数组。它们被“衰变”(自动转换)为指向适当的第一个元素的指针。所以这段代码

void swap(int a[], int size) { ... }

相当于

void swap(int* a, int size) { ... }

现在应该解释观察到的行为。

(如果确实要阻止转换,请通过引用传递数组。)

答案 1 :(得分:2)

在C和C ++中,当你将一个数组传递给一个函数时,你实际上只传递它的地址(是的,按值,但当然不会改变任何东西,因为一个地址通过值传递或者不总是指向同一地点)。

在函数中,您访问或更改的数组元素将是原始元素。

所以基本上,你的答案是你把一切都搞定了,不需要做任何事情。

示例:

void swap(int a[], int size){
    for (int i = 0; i < size/2; ++i)
    {
        a[i] ^= a[size-1-i];   // If you are interested
        a[size-1-i] ^= a[i];   // try to understand
        a[i] ^= a[size-1-i];   // how this works
    }
}

int main(){
   int x[4] = {4,5,3,12} ;
   swap(x,4) ;
   // print array here - some elements are swapped
}

答案 2 :(得分:2)

数组不是按值传递的,而是衰减为int *。检查此代码:

void swap(int a[], int size){
}

void swap(int* a, int size){
}

int main()
{
}

现在看看编译器说了什么:

$ g++ -Wall test.cpp
test.cpp: In function ‘void swap(int*, int)’:
test.cpp:4:6: error: redefinition of ‘void swap(int*, int)’
test.cpp:1:6: error: ‘void swap(int*, int)’ previously defined here

答案 3 :(得分:1)

它的工作原理是因为您没有按值传递数组。将数组传递给函数与将指针传递给数组中的第一个元素相同。因此,你实际上并没有按价值传递。

出于这个原因,我建议使用更明显的符号:

void swap(int* a, int size)

你会使用双指针:

void swap(int** a, int size)

void swap(int & a[], int size)

仅当您希望该函数更改原始数组的内存地址时。 即您重新分配内存并希望调用者接收新数组。当然,在这种情况下,你可能会导致一个令人讨厌的泄漏。

如果要强制执行按值行为调用,请将参数设为const。

void swap(const int* a, int size)

这将阻止允许该方法以任何方式更改数组。当您将视频缓冲区或某些内容传递给用户但又不希望它们破坏数据时,这非常有用。