繁体   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