为什么第二个代码有效而第一个无效呢?

时间:2019-09-08 08:58:57

标签: c++ arrays reference

我知道,为了使第一个程序正常工作,我需要通过引用传递a和b,但是,在第二个代码中,即使我在所有给定函数中按值传递数组,我也会获得所需的输出。这是为什么?如果我可以按值传递数组,为什么不在第一个程序中使用变量?

我曾尝试在StackOverflow和其他网站上寻找答案,但无法获得能够回答我问题的特定答案。

    //FIRST PROGRAM 
    #include<iostream>

    using namespace std;

    int swap (int a, int b) 
    { 
       int temp; 
       temp = a; 
       a = b; 
       b = temp; 

    }

    int main() {

        int x=5,y=6;
        swap(x,y);
        cout<<x<<y;
    }
    //SECOND PROGRAM

    #include<iostream> 

    /*Function to return max sum such that no two elements 
     are adjacent */
    int FindMaxSum(int arr[], int n) 
    { 
      int incl = arr[0]; 
      int excl = 0; 
      int excl_new; 
      int i; 

      for (i = 1; i < n; i++) 
      { 
         /* current max excluding i */
         excl_new = (incl > excl)? incl: excl; 

         /* current max including i */
         incl = excl + arr[i]; 
         excl = excl_new; 
      } 

       /* return max of incl and excl */
       return ((incl > excl)? incl : excl); 
    } 

    /* Driver program to test above function */
    int main() 
    { 
      int arr[] = {5,200,199,2}; 
      int n = sizeof(arr) / sizeof(arr[0]); 
      cout<<FindMaxSum(arr, n); 
      return 0; 
    }

2 个答案:

答案 0 :(得分:2)

在第二种情况下传递arr时,不是按值传递整个数组 ,而是按值传递指向第一个元素的指针。

您可以通过指针算术和指针引用来修改函数中的数组。显然,您不能在第一个代码段中做到这一点。

C有助于您使用功能参数列表中的int arr[]表示法,但实际上它是int* arr。呼叫站点上的arr 会衰落为指针类型。

此指针衰减发生在大多数涉及数组的操作中。 sizeof是一个重要的例外,这就是为什么您可以在调用函数中使用成语sizeof(arr) / sizeof(arr[0])的原因。但是请注意,由于指针衰减,通常这会给您FindMaxSum带来不同的结果。

答案 1 :(得分:0)

这归结为C样式数组被视为指针的事实。 void foo(int[])void foo(int*)是C中的等效声明。