簡體   English   中英

C ++ 2D數組起作用-為什么第二個索引不能變量

[英]C++ 2D array to function - Why second index cannot be variable

采取此代碼。

using namespace std;
int x = 10;

void test(int arr[][x]);

int main() {
   int mainArr[4][x];
   testFunc(mainArr);
}

void test(int arr[][x]) {
     ...
}

現在,此代碼不起作用。 我收到一條錯誤消息note: candidate function not viable: no known conversion from 'int [4][10]' to 'int (*)[x]' for 1st argument void test(int arr[][x]);' 現在,我知道,如果我每次看到x都替換為10時,它將起作用,但這不是我要的。 我問為什么C ++不允許我們將變量放入函數定義中? 我覺得我不了解c ++處理全局變量,2d數組和/或函數定義的方式,如果有人可以填寫我不了解的內容,我將不勝感激,因為我認為上面編寫的代碼應該可以能夠編譯。 謝謝。

當數組傳遞給函數時,它只是傳遞一個指向數組開頭的指針。 如果函數不知道所有低階維度的大小,則它將無法計算數組中各項的地址。

例如,如果您的函數中有一個對arr[3][4]的引用,那么如果知道較低的尺寸為10,則可以進行3 * 10 + 4的計算以計算該項目的位置。

其他類型具有附加的數據,這些數據可以包含諸如每個維的大小之類的信息,但C / C ++數組並非如此。

如果您想知道為什么它不能僅使用全局值,那是因為它需要在編譯時知道該值。 如果將聲明更改為:

const int x = 10;

然后,使用代碼就可以了,因為它知道x始終為10,因此可以在編譯時將其考慮在內。

C風格只是不允許在C ++中使用。 C樣式的數組必須具有恆定的尺寸。 無論如何,不​​鼓勵使用它們。 它們主要來自C語言的歷史遺跡。

C ++中其大小在編譯時未知的數組的名稱為vector 您的代碼可能如下所示:

int x = 10;

void testFunc(vector<vector<int>> &x);

int main() 
{
    vector<vector<int>> mainArr{ 4, vector<int>{x} };
    testFunc(mainArr);
}

如果4並不需要改變,你可以使用array<vector<int>, 4>代替,或使4模板參數。

暫無
暫無

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

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