【问题标题】:C ++ pass by reference or pass by value?C++ 通过引用传递还是通过值传递?
【发布时间】:2020-04-01 04:07:55
【问题描述】:

所以我认为 C++ 是按值工作的,除非你使用指针。

虽然今天我写的这段代码的工作方式与预期不同:

#include <iostream>

using namespace std;

void bubbleSort(int A[],int arrSize);

bool binarySearch(int B[],int key,int arrSize2);

int main(){
    int numberArr[10] = {7,5,3,9,12,34,24,55,99,77};
    bool found;
    int key;


    bubbleSort(numberArr,10);
    /**
    uncomment this piece of code
        for(int i=0; i<10; i++){
        cout<<numberArr[i]<<endl;       
    }

    **/


    cout<<"Give me the key: ";
    cin>>key;

    found=binarySearch(numberArr,key,10);

    cout<<found;
}

void bubbleSort(int A[],int arrSize){
    int temp;

        for(int i=0; i<arrSize-1; i++){
        for(int j=i+1; j<10; j++){
            if(A[i]>A[j]){
                temp=A[i];
                A[i]=A[j];
                A[j]=temp;
            }
        }
    }
}



bool binarySearch(int B[],int key,int arrSize2){
    int i=0;
    bool found=false;

    while(i<arrSize2 && !found){
    if(B[i]==key)
    found=true;
    i++;
    }


    return found;
}

运行时,numberArr 中的值似乎也在 main() 函数中发生变化(排序),只需取消注释块的注释即可。

有什么想法为什么numberArr 的值在main 函数中也会发生变化?

【问题讨论】:

  • 您实际上是在使用指针。 int B[] 等价于 int *B 作为参数。
  • 1. @UlrichEckhardt 这不等同。 2. 你可能想使用std::array
  • 这是写完全相同的东西的两种不同方式,@Sahsahae,这几乎算作等价。证明:用相同的方式声明两个函数。如果它不同,那将是一个重载,因此有两个不同的功能。如果编译器认为它们相同,那么您会收到有关重新定义的错误。

标签: c++ pass-by-reference pass-by-value


【解决方案1】:

int[] 作为一个类型,由于array decaying,本质上仍然是一个指针。因此,您传递的是一个数组“引用”(作为将用于“按引用传递”的值,而不是像 int&amp; 这样的实际 C++ 引用)而不是“值”。

int[]int* 的“值”本身仍然是“按值传递”,只是该值被用于通过引用访问“指向”对象内存。

【讨论】:

  • 指针是一个和其他东西一样的值。
  • 我看不出发生了什么变化。如果我们使用过时的术语,C++ 中的所有内容都只是“按值传递”。将值绑定为直接(和变异)引用而不是将它们复制到函数中的能力也不会改变这一事实。您提供一个值,编译器会为您完成其余的工作。提供一个数组,因为它衰减到一个指针,所有被复制的都是指针。仅此而已。
  • 这就是为什么我把这个术语放在“引号”中,因为传递引用的“想法”是“那里”,但实际上,正如你所说,一切都是传递值.也许可以对其进行编辑以使其更清楚...
【解决方案2】:

在 C++ 中,您不能按值传递数组。 你总是传递一个指向第一个元素的指针。这就是为什么您可以在不破坏代码的情况下从foo(int a[]) 切换到foo(int * a)

示例: 一些 IDE 创建如下主要函数:int main(int argc, char * argv[]) 其他为 int main(int argc, char ** argv)

你可以看看Why can't we pass arrays to function by value?这个解释的很好。

【讨论】:

    猜你喜欢
    • 2014-07-26
    • 2015-02-24
    • 2016-06-11
    • 1970-01-01
    • 2017-01-27
    • 2014-05-18
    • 2012-03-15
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多