簡體   English   中英

多維數組列寬

[英]Multidimensional Array column width

在函數中傳遞二維數組時,為什么要給出其列號如下:

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

void Array(const int [][3]); // prototype

為什么我們必須通過它列寬? 如果我將其保留為空,則會出現錯誤!

二維數組實際上是一維數組元素,而一維數組元素又是一維數組。

您可以考慮這樣的數組聲明

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

以下方式

typedef int T[3];
T arr1[2] = {{1,2,3},{4,5}};

當按值傳遞數組作為函數的參數時,它將轉換為指向其第一個元素的指針。

所以如果你有這樣的功能

void Array(const T arr[] );

那么這個聲明相當於

void Array(const T *arr );

並且兩者都聲明相同的一個功能。

重要的是要知道可以將指針算術與指針一起使用的完整類型T。 基於使用表達例如++arr那么就意味着,在當前的值arr增加sizeof( T ) 因此,編譯器需要知道sizeof(T)。 否則它將無法執行指針算術運算。

因此,回到您的示例,編譯器需要知道二維數組的元素類型,即其類型Tint[3]

所以這個清白

void Array(const int [][3]); 

相當於

void Array(const int ( * )[3]); 

或以下

typedef int T[3];
void Array(const T * );

在這種情況下,編譯器將知道由其參數(即指針)指向的對象(傳遞的數組的第一個元素)的大小。

我注意到的一件事是,這種初始化看起來很可笑:

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

arr1有2行和列。 為什么第2行的第3列沒有初始化? (僅供參考,編譯器會將其設置為零,但是我不確定這是否是意圖。)

在C語言中,多維數組表示為“扁平”一維數組。 此處說明: C數組如何在內存中表示?

在二維數組中,元素以行主順序存儲。 因此,這兩個聲明在概念上是相同的:

int arr2[ROWS][COLS];
int arr1[ROWS*COLS];

這兩個訪問在概念上是相同的:

arr2[i][j]
arr1[(i*COLS)+j]

實際上,在C語言中,第二種形式是實際情況。 這就解釋了為什么您的原型需要知道多少列-這樣編譯器就可以執行乘法運算以獲取線性數組中的適當元素。

暫無
暫無

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

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