簡體   English   中英

將2D數組傳遞給C的方法

[英]Ways to pass 2D Array to function in C

我一周前開始學習C語言。 為了測試,我決定寫一個tictactoe游戲。

我有一個領域。

int field[3][3];

和一個函數printField

void printField(int field[3][3]){
for(int i = 0; i < 3; i++){
    for(int j = 0; j < 3; j++){
        printf("%i", field[i][j]);
    }
    printf("\n");
}}

它主要在這樣工作:

int main(){
printField(field);}

但如果我改變

 void printField(int field){...}

要么

void printField(int field[][]){...}

它給了我很多錯誤:

subscripted value is neither array nor pointer nor vector                      
passing argument 1 of ‘printField’ makes integer from pointer without a cast
note: expected ‘int’ but argument is of type ‘int (*)[3]’

為什么我不能像這樣傳遞數組? 還有其他方法可以通過嗎?

該函數獨立於對該函數的任何調用。 因此,該函數無法從程序的其余部分猜測數組的大小。 在函數主體中,必須具有常量或變量才能表示所有尺寸。

您可以為此使用變量而不是固定大小:

void printField(int r, int c, int field[r][c])
{
    for(int i = 0; i < r; i++)
        for(int j = 0; j < c; j++)
            printf("%i", field[i][j]);

    printf("\n");
}

並調用該函數:

printField(3, 3, field);

您可以根據數組的名稱計算尺寸。 使用宏限制了丑陋的語法:

#define printField(a) printField( sizeof(a)/sizeof((a)[0]), sizeof((a)[0]) / sizeof((a)[0][0]), (a) )

int f1[3][3] = { 0 };
printField(f1);

int f2[4][5] = { 0 };
printField(f2);

當您將數組寫為函數時,編譯器將以靜默方式“調整”該數組並將其替換為指向第一個元素的指針。 因此,當您編寫void func (int x[3]) ,編譯器將靜默地將其替換為void func (int* x) ,其中指針指向數組的第一項。

采用這種方式設計C的原因是無法避免將大數組壓入堆棧,這會很慢並且會占用大量內存。

在您的情況下,函數void printField(int field[3][3])會在行后靜默調整為

void printField(int (*field)[3])

這是指向第一個元素的數組指針 ,第一個元素是int[3]數組。 仍然可以用作field[i][j] ,所以一切都很好。 您可以假裝它是函數內部的數組。


void printField(int field)顯然沒有任何意義。 這不是數組,而是單個項目。 您不能在純int上使用[] ,這就是編譯器告訴您的:“下標值既不是數組,也不是指針,也不是矢量”。


void printField(int field[][]){...}也不起作用,因為空的[]表示“聲明不完整類型的數組”。 在定義數組大小之前不能使用它。

void printField(int field[])情況下,由於上述函數的“數組調整”規則,這種情況發生了。 編譯器不必知道數組大小,因為無論如何它只是將數組替換為int*

但是在具有兩個未知維的情況下,編譯器將嘗試將int field[][]調整為int (*field)[] 這是一個指向不完整類型數組的指針,該函數不能使用它。

但是,您可以執行int field[][3] ,它將正常工作。

在C中,您可以像這樣傳遞數組

void printField(int **field){...}

使用pointeur比使用靜態數組要好得多:)

暫無
暫無

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

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