[英]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
假设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);
但仅当使用上面的宏时。 它不适用于const
变量 。
这两个版本都告诉编译器数组具有哪个维,因此它可以计算每个元素的地址。 可能会省略第一个维度,但没有获得任何收益,它将阻止可选的边界检查(C11选项)。 请注意,一维case char ca[]
只是此一般要求的特殊版本,您始终可以省略最左边(/最外面)的尺寸。
注意我将类型更改为(无符号) size_t
因为它是用于数组索引的适当类型,如果正确启用(强烈建议),则会生成转换警告。 但是,您可以使用int
,但必须确保没有值变为负数。
提示:如果打算将非字符整数存储在数组中或对元素进行算术运算,则应指定char
类型的带正负号。 char
可以是未签名的也可以是已签名的,具体取决于实现。 因此,根据需要使用unsigned char
或signed char
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.