2011-04-11 154 views
4

有人能讓我想起將C中的數組,特別是多維數組賦給單個值的語法嗎?初始化單值多維數組

我相信花括號做到這一點,雖然我收到一個編譯器錯誤,當我測試:

int ArrayName [5][5] = {1}; 

到數組初始化爲1

+1

你會得到什麼錯誤? – SLaks 2011-04-11 02:38:51

+0

[擴大閱讀。](http://stackoverflow.com/q/201101/365102) – 2011-04-11 02:43:45

+1

隨着花括號花括號,你應該爲數組的每個成員提供一個單獨的值(缺失值設置爲0)。因爲它很容易理解,所以我會選擇Elalfer的答案。另一方面,如果你有C++可用,向量可以初始化爲同一個值的多個副本(儘管這可能會與多維度混亂)。另一方面請注意:如果您在堆上分配內存,則可以使用calloc而不是malloc來將內存初始化爲0. – 2011-04-11 02:56:21

回答

1

我不知道這是不可能的。您應該使用forwhile循環。

如果您想用單個字節填充內存,則可以使用memset函數。

+0

使用int ArrayName [5] [5] = {1};'是合法的,[但它不會做你期望的事情](http://stackoverflow.com/q/201101/365102)。 – 2011-04-11 02:47:58

1

多維數組可以使用 指針與malloc動態構建。在下面的例子中,聲明瞭一個指針指向int的指針 。在聲明後,指針 沒有意義。到mallac然後調用請求 指針指向的NX有效存儲器單元的嵌段:

x = (int **) malloc(nx * sizeof(int *)); 

這個調用後,X現在具有有效值;具體地說,包含nx 指針到int的存儲器塊的起始地址是 。正如我們多次看到的,指向int的每個指針只是一個常規的指針 。他們還有待 初始化爲任何有意義的,並且可以分別訪問 爲任何

x[0], x[1] ... x[nx-1], OR *x, *(x+1), *(x+2), 
    ... *(x+nx-1). 

爲了讓eachof這些指針有意義的值, 我們可以調用malloc爲他們每個人,如被完成通過 這個循環:

for (i=0;i<nx;++i){ 
    x[i] = (int *) malloc(ny * sizeof(int)); 
    } 

請注意,我們也可以說:

for (i=0;i<nx;++i){ 
    *(x+i) = (int *) malloc(ny * sizeof(int)); 
    } 

現在我們的指針數組中的每個指針都指向一個有意義的內存塊(每個大小爲ny個int),我們可以指定 值。要了解如何分配值,請考慮下面的 示意圖。你需要仔細研究,直到 這很清楚發生了什麼。這可能有點棘手,但一旦你掌握了它,它就不會那麼糟糕。

x[0] ---> | *x[0] | *x[0]+1 | *x[0] + 2 | ... | *x[0]+ny-1 | 
    x[1] ---> | *x[1] | *x[1]+1 | *x[1] + 2 | ... | *x[1]+ny-1 | 

    . 
    . 
    . 
    x[nx-1] ---> | *x[nx-1] | *x[nx-1]+1 | *x[nx-1] + 2 | ... | *x[nx-1]+ny-1 | 

這相當於:

x[0] ---> | *(*(x+0)+0) | *(*(x+0)+1) | *(*(x+0)+2) | ... | *(*(x+0)+ny-1) | 
    x[1] ---> | *(*(x+1)+0) | *(*(x+1)+1) | *(*(x+1)+2) | ... | *(*(x+1)+ny-1) | 
    . 
    . 
    . 
    x[nx-1] ---> | *(*(x+nx-1)+0) | *(*(x+nx-1)+1) | *(*(x+nx-1)+2) | ... | *(*(x+nx-1)+ny-1) | 

這相當於:

x[0] ---> | x[0][0] | x[0][1] | x[0][2] | ... | x[0][ny-1] | 
    x[1] ---> | x[1][0] | x[1][1] | x[1][2] | ... | x[1][ny-1] | 
    . 
    . 
    . 
    x[nx-1] ---> | x[nx-1][0] | x[nx-1][1] | x[nx-1][2] | ... | x[nx-1][ny-1] | 

...給出的這些重要關係:

*(*(x + i) + j) = *(x[i] + j) = x[i][j] 
+4

我無法看到答案和問題之間的聯繫.... – AnT 2011-04-11 04:48:44

1

你可以這樣做:

int ArrayName[5][5]; 

for(size_t i = 0; i < 5; i++) 
    for(size_t i2 = 0; i2 < 5; i2++) 
     ArrayName[i][i2] = 1; 

或者更高效:

int ArrayName[5][5]; 

for(size_t i = 0, *ptr = ArrayName; i < (5*5); ++i, ++ptr) 
    *ptr = 1; 

如果你足夠瘋狂,你會創建一個功能它:

void init_arr(void* ptr, void* value, size_t size) 
{ 
    for(size_t i = 0; i < size; ++i, ++ptr) 
     *ptr = *value; 
} 

int ArrayName[5][5]; 
int val = 1; 
init_arr(ArrayName, val, 5 * 5); 

如果你w用C++ ERE,您可以使用模板:

template <class T> 
void init_arr(T *ptr, T value, size_t size) 
{ 
    for(size_t i = 0; i < size; ++i, ++ptr) 
     *ptr = value; 
} 

int ArrayName[5][5]; 
init_arr(ArrayName, 1, 5 * 5); 

如果你真的使用C++,你會用向量......哎呀,有可能是一個花哨的升壓方式做到這一點。 :)

6

C語言中沒有簡潔的語法,它可以將數組的所有元素初始化爲單個值,而不管該數組是多維還是單維。有語法可以將所有元素都設置爲零(並且它是= { 0 }),但對於任何其他值都是不可能的。

當然,你可以拼出所有數組元素的單個初始值設定項,但這可能不是你要找的。

您所能做的就是手動將所有元素設置爲特定值,方法是使用賦值。