将2D char数组传递给C

时间:2015-07-24 22:13:50

标签: c arrays multidimensional-array

我是一个初学程序员,他对将二维数组传递给函数感到困惑。我认为这可能只是一个简单的语法问题。我已经找到了答案,但我发现的任何内容似乎都没有帮助,或者远远高于我的水平,让我无法理解。

我在主函数中识别数组和函数,并在初始化之后尝试调用它:

#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);
}

在主函数之外编写函数时,我将其定义与在main函数中完全相同。

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)
                        ^

请注意,我正在尝试将整个数组传递给函数,而不仅仅是单个值。我该怎么做才能解决这个问题?如果它不必使用指针,我会很感激,因为我觉得它们很混乱。此外,我试图忽略我认为不重要的事情,但我可能错过了我需要的东西,或者保留在我没有的东西中。感谢您抽出时间帮助这位初学程序员!

3 个答案:

答案 0 :(得分:1)

您可以将数组作为函数参数传递,并定义其大小。

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

当大小未知时,指针就是这样。

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

你应该知道,数组!=指针,但指针可以存储数组的地址。

答案 1 :(得分:0)

这是一个示范程序

#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

答案 2 :(得分:0)

在C中不允许在另一个函数内定义函数(此处为:<scope>provided</scope>)。这是某些编译器(例如gcc)的扩展,但不应该使用。

您必须指定数组的尺寸。 C数组没有HLL中的隐式大小信息。

对于C中的数组维度,使用main 变量也不是一个好主意。相反

const

假设#define ROWS 8 #define COLS 8 i是数组中元素的索引,您可以使用签名:

j

这允许将(运行时)可变大小的数组传递给函数。如果在运行时保证尺寸固定:

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); 变量

两个版本都告诉编译器数组具有哪个维度,因此它可以计算每个元素的地址。第一个维度可能被省略,但没有任何获得,它将禁止可选的边界检查(C11选项)。请注意,1D案例const只是此一般要求的特殊版本,您始终可以省略左(/外)最维度。

注意我将类型更改为(unsigned)char ca[],因为这是数组索引的适当类型,如果启用正确,将生成转换警告(强烈建议)。但是,您可以使用size_t,但必须确保没有值变为否定值。

提示:如果您打算在数组中存储非字符整数或对元素进行算术运算,则应指定int类型的signed-ness。 char本身可以是未签名的或签名的,具体取决于实现。因此,根据您的需要使用charunsigned char