二维数组名作实参时,形参的问题

书上说, 当二维数组名作为实参时,对应的形参必须是一个行指针变量。如
#include<stdio.h>
#define M 5
#define N 3
main()
{double s[M][N];
......
fun(s);
......
}
则fun函数的首部可以是以下三种形式之一:
(1)fun(double (*a)[N] )
(2) fun (double a[][N] )
(3) fun (double a[M][N] )
列下标不可缺。
无论是哪种形式,系统都将把a处理成一个行指针。

问:
(a) 难道以上三种形式在系统中都是一样的么?? 那这么说M的值就没有任何意义了么??
是不是M的值就可以随便写了,不一定和主函数中的数组s中的M值一样么???

(2)书上还说, 在函数中引用的将是主函数中的数组元素,系统只为形参开辟了一个存放地址的存储单元,不可能在调用函数时为形参开辟一系列存放数组的存储单元。
问 :(b) 怎么能只开辟了一个存储单元呢?那 函数fun的首部写成这样
fun(double a[M][N] ) 难道系统也是为形参a开辟一个存储单元么,不是开辟一个数组么??行下标M, 列下标N 两个下标 都没有意义了么???那 M 还有什么意义??N 还有什么意义???
(2)就算形参写成数组形式,系统都只为形参开辟一个存储单元么???
是不是不管下标如何,形参都不会有数组越界的可能????

一维数组形式作形参, 二维数组形式作形参 都不会有越界问题吗????

第1个回答  2013-03-24
想着数组作为参数时传递的是地址就明白了!如果越界会报错的。
第2个回答  2012-03-01
1、前两者相同,是这个二维数组的首地址,第三个是传入二维数组的最后一个元素值。因为在c中二维数组是当做一维数组来处理的,在内存中是连续的,也就是说a[m][n]在内存中跟a[m*n]是一样的,只是两个a的类型不同而已,为了匹配类型,只需告诉被调用函数有多少列即可。
2、如果写成fun(double a[M][N] ) ,那么传入的就只是一个double类型的变量而已。我们如果在调用函数时传入数组其实是传入的数组的首地址,通过告诉调用函数有多少列来知道实参数组的排列。
所以只要搞清楚我们无论传入一个字符串还是一个N维数组只是传入的一个4字节(32位处理器)的指针,很多谜题都解开了。本回答被网友采纳
相似回答