簡體   English   中英

C ++-通過引用傳遞,數組很奇怪

[英]C++ - Pass by Reference, Weird Thing for Array

據我所知,C ++使用Ampersand(&)進行引用傳遞。 但是我只是測試了這段代碼,我不知道為什么第二個功能看起來和第一個功能相似。 似乎第二個功能是現在通過引用傳遞功能。

#include <iostream>
using namespace std;

void f1(int (&b)[5])
{
    b[0]=1;
}

void f2(int b[5])
{
    b[1]=2;
}

int main()
{
    int a[5];
    f1(a);
    f2(a);

    cout<<a[0]<<endl;
    cout<<a[1]<<endl;
}

輸出:

1
2

有人可以向我解釋一下嗎? 謝謝。

將數組傳遞給函數時,它會退化為指針。 因此,無論哪種情況,結果都是相同的。

因此,在f2情況下, b是一個指針,它指向數組a始於的相同位置。 還請記住,數組索引[ a[i] ]和指針算術和解引用[ *(a+i) ]是同義詞。 因此,在第二種情況下,您最終將更新傳遞的原始數組。

現在,這兩個聲明之間有細微的差別。 f1情況下,參數b是對原始數組a的引用,因此b仍然是具有源數組所有特征的同一數組。 在第二個表達式的情況下, b只是一個指針,偶然地指向數組a的位置。

考慮到參數理想上是不同的事實,它們具有不同的行為

  1. 引用變量的Sizeof返回數組的實際大小。
  2. 您不能在函數內部修改引用參數。

為了完整起見,這里有一個更新的程序,它將使您更加了解行為的不同之處。

#include <iostream>
using namespace std;

void f1(int (&b)[5])
{
    std::cout<<sizeof(b)<<std::endl;
    //b = new int[5]; -- Will give compile error
    b[0]=1;
}

void f2(int b[5])
{
    std::cout<<sizeof(b)<<std::endl;
    //b = new int[5]; -- Will compile fine
    b[1]=2;
}
int main()
{
    int a[5];
    f1(a);
    f2(a);

    cout<<a[0]<<endl;
    cout<<a[1]<<endl;
}

數組始終“通過引用傳遞” 數組的名稱是一個指針
到數組的第一個元素。 因此,參數int b[5]
第二個函數與int* b基本相同。

默認情況下,數組由指針傳遞,即數組的基地址。 因此,在f2()a的基地址復制到b以便可以以正常指針方式從函數中對其進行訪問。

當您通過引用傳遞數組時,它不占用任何額外的內存,而只是重命名它,您仍然可以以與塊中相同的方式(通過使用為其賦予的別名)訪問該數組。您最初是在定義它。

希望能有所幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM