C语⾔⼆维数组作为函数的参数
前⾔:今天在实现装配线调度程序时候,⽤到了⼆维数组,并将其作为函数的参数。在写程序的时候,遇到⼀些问题,即⼆维数组做函数的参数应该如何正确表⽰。我写程序的错误如下程序所⽰:
1 #include <cstdio>
2 void print(int *a[3])
3 {
4 printf("%d\n",a[0][0]);
c语言二维数组表示方法5 }
6
7 int main()
8 {
9 int a[2][3] = {1,2,3,4,5,6};
10 print(a);
11 return 0;
12 }
编译程序时候,在第10⾏提⽰错误信息:|10|error: cannot convert 'int (*)[3]' to 'int**' for argument '1' to 'void print(int**)'|。根据错误提⽰我明⽩了, int *a[3]表⽰⼀个⼀维数组,数组的数据类型为整型指针(int*),数组的⼤⼩为3,这是因为[]的优先级⾼于*的优先级。如是我将程序改写如下,顺利通过编译,得到正确结果。
1 #include <cstdio>
2 void print(int (*a)[3]) //⽤括号将指针括起来
3 {
4 printf("%d\n",a[0][0]);
5 }
6
7 int main()
8 {
9 int a[2][3] = {1,2,3,4,5,6};
10 print(a);
11 return 0;
12 }
下⾯来总结⼀下⼆维数组作为函数参数该如何表⽰。
1、⼆维数组的概念
在C语⾔中,⼆维数组实际上是⼀种特殊的⼀维数组,它的每个元素也是⼀个⼀维数组。因此,⼆维数组下标形式正确写法如下:int arrays[i][j]。数组元素是按照⾏顺序存储的,因此当按存储顺序访问树时,最右边的数组下标(列)变化的最快。
2、⼆维数组作为函数参数
规定:如果将⼆维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的⾏数没有太⼤关系,可以指定也可以不指定。因为函数调⽤时传递的是⼀个指针,它指向由⾏向量够成的⼀维数组。因此⼆维数组作为函数参数正确写法如下所⽰:
void Func(int array[3][10]);
void Func(int array[ ][10]);
因为数组的⾏数⽆关紧要,所以还可以写成如下形式:
void Func(int (*array)[10]); 注意*array需要⽤括号括起来。
这种形式的声明参数是⼀个指针,它指向具有10个元素的⼀维数组。因为[]的优先级⽐*的优先级⾼,故*array必须⽤括号括起来,否则变成了
void Func(int *array[10]);
这时候参数相当于是声明了⼀个数组,该数组有10个元素,其中每个元素都是⼀个指向整型对象的指针。
但是不能把第⼆维或者更⾼维的⼤⼩省略,如下⾯的定义是不合法的:
void Func(int array[ ][ ]);
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按⾏存放),⽽并不区分⾏和列,如果在形参中不说明列数,则系统⽆法决定应为多少⾏多少列,不能只指定⼀维⽽不指定第⼆维,下⾯写法是错误的:
void Func(int array[3][ ]);
实参数组维数可以⼤于形参数组,例如形参数组定义为:
void Func(int array[3][10]);
⽽实参数组定义为:int array[5][10]; 进⾏函数调⽤Func(array)时,由于数组在内存中是连续存放的,虽然形参与实参数组⾏数不对应,但
是列数是相同的,具有相同的起始地址,这样可以访问到后续的值。如下述程序:
1 #include <stdio.h>
2
3 void print_array(int *array, int len)
4 {
5 int i = 0;
6 for ( ; i < len; i++) {
7 printf("%d ",array[i]);
8 }
9 putchar('\n');
10 }
11
12 void func(int array[3][10])
13 {
14 print_array(array[0], 10);
15 print_array(array[1], 10);
16 print_array(array[2], 10);
17 print_array(array[3], 10);
18 print_array(array[4], 10);
19 }
20
21 int main()
22 {
23 int array[5][10] = {
24 {0,1,2,3,4,5,6,7,8,9},
25 {10,11,12,13,14,15,16,17,18,19},
26 {20,21,22,23,24,25,26,27,28,29},
27 {30,31,32,33,34,35,36,37,38,39},
28 {40,41,42,43,44,45,46,47,48,49}
29 };
30 func(array);
31 return 0;
32 }
参考资料:
1、
2、K&R《C语⾔程序设计》第⼆版P95-P97
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论