簡體   English   中英

通過引用傳遞數組並修改值C ++

[英]Pass array by reference and modify values C++

我想編寫一個函數,它接受inArray[3] = {1,2,3,4}outArray[3] ,並修改outArray[3] ,現在包含values = {3,4,1, 2}。

int main{
 int inArray[4] = {1,2,3,4};
 int outArray[4];

 myFunction(&inArray, &outArray);
}

void myFunction(&inArray, &outArray){
  outArray[0] = inArray[2];
  outArray[1] = inArray[3];
  outArray[2] = inArray[0];
  outArray[3] = inArray[1];
}

我在這里做錯了,我並不完全理解如何通過引用傳遞數組並操縱函數內部的值。

功能及其調用可以通過以下方式查看

const size_t N = 4;

void myFunction( int ( &inArray )[N], int ( &outArray )[N] )
{
  outArray[0] = inArray[2];
  outArray[1] = inArray[3];
  outArray[2] = inArray[0];
  outArray[3] = inArray[1];
}

int main()
{
 int inArray[N] = {1,2,3,4};
 int outArray[N];

 myFunction( inArray, outArray );
}

考慮到你對數組的定義

int inArray[3] = {1,2,3,4};

包含拼寫錯誤,不會被編譯。 必須至少有喜歡

int inArray[4] = {1,2,3,4};

要么

int inArray[] = {1,2,3,4};

您的數組大小為3,但您嘗試在其中存儲4個元素並訪問[3]處的第四個元素(具有未定義的行為)。

使它們更大,硬編碼4或使所有內容自動調整到用於初始化inArray的數字列表的當前長度:

int inArray[] = {1,2,3,4};  // automatically sized
int outArray[sizeof inArray / sizeof *inArray];

然后,您的函數簽名應指定參數的array-of- int 有很多方法可以做到這一點:

void myFunction(const int inArray[], int outArray[])         // 1
void myFunction(const int* inArray, int* outArray)           // 2
void myFunction(const int (&inArray)[4], int (&outArray)[4]) // 3
template <size_t N>
void myFunction(const int (&inArray)[N], int (&outArray)[N]) // 4
  • 第一個顯然是最簡單的。

  • 第二個是等價的,因為當調用者傳遞數組參數時,它們被允許衰減為指針,甚至1)也會發生這種情況,因為只有在通過引用接受數組時才能捕獲或強制執行數組維,如下例所示。 ..

  • 第三個另外確保數組參數恰好有4個元素(所以突然你不能(輕松)傳遞說10個元素的數組並且只復制前4個元素)。

  • 第四個接受任何大小的數組,但如果在不同大小的數組上使用不同的調用代碼,它可能會創建myFunction代碼的多個副本,可能會為更大的程序使用更多的內存。

由於你是對元素[0][3]函數體硬編碼操作,它不會調整為在元素上進一步做大的數組,但你可以選擇在函數體內使用N值來計算要操作多少元素。

數組總是通過引用傳遞,無需通過引用手動傳遞它。

暫無
暫無

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

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