簡體   English   中英

將2D char數組傳遞給C中的函數

[英]Pass a 2D char array to a function in C

我是一個入門程序員,對將二維數組傳遞給函數感到困惑。 我認為這可能只是一個簡單的語法問題。 我一直在尋找答案,但是發現的任何內容似乎都無濟於事,或者太高了,我無法理解。

我在主函數中將數組和函數標識為,並在對其進行初始化之后嘗試調用它:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int const ROWS = 8;
int const COLS = 8;

int main(int argc, char** argv) {

char board[ROWS][COLS];

bool canReach(char board[][], int i, int j);

//initialize array

//values of i and j given in a for loop

canReach(board, i, j);

return (EXIT_SUCCESS);
}

在主函數之外編寫函數時,我對其定義的定義與在主函數中所做的定義完全相同。

bool canReach(char board[][], int i, int j){
//Functions purpose
}

當我嘗試生成程序時,兩次出現此錯誤,並且程序無法生成:

error: array has incomplete element type 'char[][]'
bool canReach(char board[][], int i, int j)
                        ^

請注意,我試圖將整個數組傳遞給函數,而不僅僅是一個值。 我該怎么做才能解決此問題? 如果不必使用指針,我將不勝感激,因為我發現它們非常令人困惑。 另外,我嘗試遺漏了一些我認為並不重要的事情,但是我可能錯過了我需要的東西,或者保留了我不需要的東西。 感謝您的時間來幫助這個入門程序員!

您可以將數組作為函數參數傳遞,並定義其大小。

bool canReach(char board[ROWS][COLS], int i, int j);

當大小未知時,可以使用指針。

bool canReach(char* board, int i, int j);

您應該知道, 數組!=指針,但是指針可以存儲數組的地址。

這是一個示范節目

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

bool canReach( int n, int m, char board[][m] )
{
    for ( int i = 0; i < n; i++ )
    {
        for ( int j = 0; j < m; j++ )
        {
            board[i][j] = 0;
        }
    }

    return printf( "Hello SaarthakSaxena" );
}    

int main( void )
{
    const int ROWS = 8;
    const int COLS = 8;

    char board[ROWS][COLS];

    canReach( ROWS, COLS, board );

    return EXIT_SUCCESS;
}

它的輸出是

Hello SaarthakSaxena

在C語言中不允許在另一個函數(此處為main )中定義一個函數。這是某些編譯器(例如gcc)的擴展,但不應使用。

您必須指定數組的尺寸。 C數組沒有HLL中的隱式大小信息。

在C中使用const 變量作為數組維數也不是一個好主意。

#define ROWS 8
#define COLS 8

假設ij是數組中元素的索引,則可以使用簽名:

bool canReach(size_t rows, size_t cols, char board[rows][cols],
        size_t i, size_t j);

這允許將(運行時)可變大小的數組傳遞給函數。 如果在運行時保證尺寸固定:

bool canReach(char board[ROWS][COLS], size_t i, size_t j);

但僅當使用上面的宏時。 它不適用於const 變量

這兩個版本都告訴編譯器數組具有哪個維,因此它可以計算每個元素的地址。 可能會省略第一個維度,但沒有獲得任何收益,它將阻止可選的邊界檢查(C11選項)。 請注意,一維case char ca[]只是此一般要求的特殊版本,您始終可以省略最左邊(/最外面)的尺寸。

注意我將類型更改為(無符號) size_t因為它是用於數組索引的適當類型,如果正確啟用(強烈建議),則會生成轉換警告。 但是,您可以使用int ,但必須確保沒有值變為負數。

提示:如果打算將非字符整數存儲在數組中或對元素進行算術運算,則應指定char類型的帶正負號。 char可以是未簽名的也可以是已簽名的,具體取決於實現。 因此,根據需要使用unsigned charsigned char

暫無
暫無

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

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