我是一个初学程序员,他对将二维数组传递给函数感到困惑。我认为这可能只是一个简单的语法问题。我已经找到了答案,但我发现的任何内容似乎都没有帮助,或者远远高于我的水平,让我无法理解。
我在主函数中识别数组和函数,并在初始化之后尝试调用它:
#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)
^
请注意,我正在尝试将整个数组传递给函数,而不仅仅是单个值。我该怎么做才能解决这个问题?如果它不必使用指针,我会很感激,因为我觉得它们很混乱。此外,我试图忽略我认为不重要的事情,但我可能错过了我需要的东西,或者保留在我没有的东西中。感谢您抽出时间帮助这位初学程序员!
答案 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
本身可以是未签名的或签名的,具体取决于实现。因此,根据您的需要使用char
或unsigned char
。