2017-02-19 84 views
4

我有點轉身在這樣做的確切語法。我有一個數組定義爲這樣:C數組的const無符號字符[] []

const unsigned char ARR[SIZE][SIZE] = {...} 

,我希望把它在一個數組,所以我可以做一些我已經試過const unsigned char ARR2[][SIZE][SIZE] = {ARR}const unsigned char* ARR2[SIZE][SIZE] = {ARR},但既不是

ARR2[0] = ARR 

效果那些工作。有人可以指出正確的語法是否有一個常數二維無符號字符數組的常量數組?

+0

目前還不清楚你試圖達到的目標:你可以在你試圖使用'ARR'和這個'ARR2' thingy的地方發佈代碼嗎? – chqrlie

+0

你的意思是你想要一個'[SIZE] [SIZE]'數組的數組,或者一個指向'[SIZE] [SIZE]'數組的指針數組? – Dolda2000

+0

換句話說,你打算讓'ARR2 [0]'指向'ARR',還是本身就是一個用'ARR'的內容初始化的數組? – Dolda2000

回答

2

從到haccks的回答您的意見,這聽起來像你想的:

const unsigned char ARR[SIZE][SIZE] = {...}; 
const unsigned char (*ARR2[])[SIZE][SIZE] = {&ARR}; 

如果你想ARR2自己是const,這將是這樣的:

const unsigned char (* const ARR2[])[SIZE][SIZE] = {&ARR}; 

它應該也許還要注意的是,你不能使用這種憎惡來訪問ARR[x][y]作爲ARR2[0][x][y],但需要做(*ARR2[0])[x][y](或者等效地,ARR2[0][0][x][y])。

可能值得注意的另一個必然結論是,您不能指定ARR2ARR2[0] = ARR,但您需要明確地做ARR2[0] = &ARR(至少爲了避免警告)。其原因是,ARR退化爲一個指針到其第一元件,也就是一個const unsigned char *其值是&ARR[0][0],而ARR2[0]期望被分配const unsigned char (*)[SIZE][SIZE],其與&ARR獲得。儘管兩種情況下指針值都是相同的,但類型不是。

+0

這在技術上是正確的,但似乎領先於OPs技能水平。事實上,它看起來像一個編譯器一致性測試。 – chqrlie

+0

是的,當我開始寫ARR2時,我意識到它會變得有點混亂。我需要有一個數組數組,並且出於可移植性的原因需要每個數組都有自己的頭文件。 我明白這裏發生了什麼;我想我錯誤的印象是,任何時候你使用一個數組,它都被轉換爲一個引用。 – user2752635

+1

@ user2752635:不確定,但是從您對Sergio的回答的評論中,它聽起來像您可能錯誤地認爲變量初始化與變量賦值相同(或至少類似於)變量賦值,這可能離真相。 – Dolda2000

-1

試試這個

const unsigned char (* ARR2)[SIZE] = ARR; 

您在您的評論中提到要ARR2是可以容納陣列ARR,因爲它是第一個元素的數組,但這是不可能的ARR是一個數組,當它是一元運算符&sizeof的操作數時,它將轉換爲它的第一個元素的指針。

+1

我不想有一個指向ARR的指針。我想要一個數組,其中第一個索引指向ARR。 – user2752635

+1

@ user2752635;更新了答案。 – haccks

1

看起來像你試圖實現的是不可能的,因爲賦值運算符的左操作數只能是算術,結構/聯合或指針類型,而不是數組。詳情請看這裏:6.5.16.1 Simple assignment

所以唯一的辦法是你只有memcpy()'ing。

+0

我不明白。 'const unsigned char ARR [SIZE] [SIZE] = {...}'編譯好。我可以在我的代碼中使用ARR。設置一個等於某事的數組不是問題,問題在於鍵入。 這可能是gcc的一個功能,但我可以肯定地初始化一個數組。 – user2752635

相關問題