我是一名初级程序员,对将二维数组传递给函数感到困惑。我想这可能只是一个简单的语法问题。我一直在寻找一个答案,但我没有找到任何帮助,或者对我来说太超出我的水平而无法理解。
我将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
假设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选项)。请注意,1d情况下的char ca[]
只是这个一般要求的一个特殊版本,您总是可以省略最左(/外)维度。
注意,我将类型更改为(unsigned) size_t
,因为这是适合数组索引的类型,如果正确启用,将生成转换警告(强烈推荐)。但是,您可以使用int
,但必须确保没有值变为负值。
提示:如果您打算在数组中存储非字符整数或对元素进行算术运算,则应该指定char
类型的有符号性。char
本身可以是unsigned也可以是signed,这取决于实现。因此,使用unsigned char
或signed char
,这取决于你想要的。