将2D字符数组传递给C中的函数



我是一名初级程序员,对将二维数组传递给函数感到困惑。我想这可能只是一个简单的语法问题。我一直在寻找一个答案,但我没有找到任何帮助,或者对我来说太超出我的水平而无法理解。

我将main函数中的数组和函数标识为,并在初始化它之后,尝试调用它:

#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选项)。请注意,1d情况下的char ca[]只是这个一般要求的一个特殊版本,您总是可以省略最左(/外)维度。

注意,我将类型更改为(unsigned) size_t,因为这是适合数组索引的类型,如果正确启用,将生成转换警告(强烈推荐)。但是,您可以使用int,但必须确保没有值变为负值。

提示:如果您打算在数组中存储非字符整数或对元素进行算术运算,则应该指定char类型的有符号性。char本身可以是unsigned也可以是signed,这取决于实现。因此,使用unsigned charsigned char,这取决于你想要的。

相关内容

  • 没有找到相关文章

最新更新