[英]Multi-dimensional array initialization
我今天在C ++考試中看到了一個問題:
給定數組 int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
, Multi[1][1][0]
的值是多少? Multi[1][1][0]
?
不應該像這樣初始化三維數組: {{{},{}},{{},{}},{{},{}}}
? 如何找到具有此類indeces的元素的值? 這太令人困惑了。
您可以通過兩種方式初始化數組,但建議使用卷曲內括號,因為它可以提高可讀性。
找到未使用大括號格式化的多維數組元素值的最簡單方法是拆分數組。 例如,您的數組的尺寸為2x3x2:
首先將數組拆分為2組( 2 x3x2)
{14,11,13,10,9,6,8,7,1,5,4,2} --> {{14,11,13,10,9,6}, {8,7,1,5,4,2}}
然后將每組分成3組(2x 3 x2)
{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}
現在,正如您所看到的,每個較小的集合中都有2個元素(2x3x 2 ),因此您已使用大括號格式化數組。
現在,找到索引為[1][1][0]
的元素的值更簡單。 這個元素是第二個([ 1 ] [1] [0])較大集合的第二個([1] [ 1 ] [0])較小集合的第一個([1] [1] [ 0 ])元素,所以答案是1 。
話雖這么說,這樣的考試問題表明你的老師缺乏專業性,他對濫用編程語言語法更感興趣,而不是教授基本的初始化規則。
應該產生滿分的正確答案是:編譯代碼並啟用所有警告,你最終不會像這樣編寫蹩腳的代碼。
gcc test.c -std=c11 -pedantic-errors -Wall -Wextra
test.c: In function 'main':
test.c:6:3: warning: missing braces around initializer [-Wmissing-braces]
int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2};
^
但是,我懷疑你的老師不是那么關心代碼是垃圾,而是在尋找C語言中的細節,它允許初始化數組(和結構),即使括號列表與什么是初始化。
就C語言而言, int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
完全等同於:
// properly written initialization list for a 3D array
int Multi[2][3][2] =
{
{
{14, 11},
{13, 10},
{ 9, 6}
},
{
{ 8, 7},
{ 1, 5},
{ 4, 2}
}
};
第一種形式被允許的唯一原因是因為它允許你寫出類似的東西
int Multi[2][3][2] = {0};
它將第一個元素顯式初始化為0,其余元素顯式初始化為靜態存儲持續時間(0)。 意味着所有元素都將設置為零。
像int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}
正在濫用C語言。 這是非常糟糕的做法。 這樣做是由MISRA-C等禁止的。
一個好老師會關心教你如何啟用所有編譯器警告以及如何正確初始化多維數組,而不是讓你解釋混淆的無意義代碼。
int Multi [2] [3] [2] = {14,11,13,10,9,6,8,7,1,5,4,2};
Multi [2] [3] [2]的存儲器映射是 - >
多[0] [0] [0] = 14;
多[0] [0] [1] = 11;
多[0] [1] [0] = 13;
多[0] [1] [1] = 10;
多[0] [2] [0] = 9;
多[0] [2] [1] = 6;
多[1] [0] [0] = 8;
多[1] [0] [1] = 7;
多[1] [1] [0] = 1;
多[1] [1] [1] = 5;
多[1] [2] [0] = 42;
多[1] [2] [1] = 2;
因此Multi [1] [1] [0] = 1的值; 這很簡單
我們也可以像這樣初始化
int Multi [2] [3] [2] = {{{14,11},{13,10},{9,6}},{{8,7},{1,5},{4,2 }}};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.