C语言 数组作为参数传递问题

请问数组作为参数在函数原型中一定要写"void function(int array[])",在调用时就把[]去掉,这是为什么?
比如下面一段代码:
#include <stdio.h>
static void DisplayBoard(char board[][3]);
main()
{
char board[3][3]={{'X','O','X'},{' ','X','O'},{'X',' ','O'}};
DisplayBoard(board);

return 0;
}

static void DisplayBoard(char board[][3])
{
int row,column;
for(row=0;row<3;row++)
{
if(row!=0)
printf("---+---+---\n");
for(column=0;column<3;column++)
{
if(column!=0)
printf("|");
printf("%3c",board[row][column]);
}
printf("\n");
}
}
上面的代码中函数声明、调用和定义中的数组分别有哪几种写法?都是什么含义?
请帮忙解答,万谢。

    以下是我写的一个简单的例子,一维数组和二维数组传参。

    以下是运行结果,写的不好请指正,如图所示。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-08
不是写法的问题,可能你对数组的具体含义还不太清楚哈。
一个一维数组的数组名是指向这个数组首地址的指针,比如:
int a[3]={1,2,3};
printf("%d",*a);
输出:1
a就是指向这个数组的首地址的指针,当用:
int *b;
b=a+1;//a地址加1,指向下一个元素
printf(%d",*b);
输出:2

二维数组名是指向数组首行的指针,与一维类似,但区别也很大,具体的你去翻你的课本吧,没课本去百度百科。

在说函数,先说了,数组名其实就是指针,但a[2]这就是数值了,所以在申明函数的时候你可以这样申明(或定义):
static void DisplayBoard(char board[][3])
{printf("%c",board[0][0]);}
也可以这样申明(或定义):
static void DisplayBoard(char *board)
{printf("%c",board[0][0]);}
这两种申明方式是等价的,都可以用下标法访问。

在调用的时候,函数要求的是输入数组,如果你用:
DisplayBoard(board[3][3]);
这是不行的,board[3][3]是一个数值,而不是一个数组,数组做参数时是将数组首地址传递给函数了,所以用数组名或者用指针都可以:
char *a;
a=board
//下面两种效果是一样的
DisplayBoard(board);
DisplayBoard(a);
第2个回答  推荐于2018-02-27
不是写法的问题,可能你对数组的具体含义还不太清楚哈。
一个一维数组的数组名是指向这个数组首地址的指针,比如:
int a[3]={1,2,3};
printf("%d",*a);
输出:1
a就是指向这个数组的首地址的指针,当用:
int *b;
b=a+1;//a地址加1,指向下一个元素
printf(%d",*b);
输出:2

二维数组名是指向数组首行的指针,与一维类似,但区别也很大,具体的你去翻你的课本吧,没课本去百度百科。

在说函数,先说了,数组名其实就是指针,但a[2]这就是数值了,所以在申明函数的时候你可以这样申明(或定义):
static void DisplayBoard(char board[][3])
{printf("%c",board[0][0]);}
也可以这样申明(或定义):
static void DisplayBoard(char *board)
{printf("%c",board[0][0]);}
这两种申明方式是等价的,都可以用下标法访问。

在调用的时候,函数要求的是输入数组,如果你用:
DisplayBoard(board[3][3]);
这是不行的,board[3][3]是一个数值,而不是一个数组,数组做参数时是将数组首地址传递给函数了,所以用数组名或者用指针都可以:
char *a;
a=board
//下面两种效果是一样的
DisplayBoard(board);
DisplayBoard(a);本回答被提问者和网友采纳
相似回答