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

c759541810 2012-03-03 01:07:14
书上说, 当二维数组名作为实参时,对应的形参必须是一个行指针变量。如
#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)就算形参写成数组形式,系统都只为形参开辟一个存储单元么???
是不是不管下标如何,形参都不会有数组越界的可能????

一维数组形式作形参, 二维数组形式作形参 都不会有越界问题吗????
...全文
902 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2012-03-03
  • 打赏
  • 举报
回复
都是一样的,不论你传递的是什么形式的参数(对于二维数组,你需要把列数传过去),编译器都以指针处理。函数传参不外乎两种吧, 一种值传递,另一种就是你这种地址传递。传值是传递的实参的副本即被调用函数会单独开辟空间用于存放实参的副本,传地址传递的是实参的地址,在被调用函数中修改的就是实参的值,而不是副本。
会有越界的可能,C语言的高效性是以不检查数组下表是否越界为代价的,数组是否越界,检查任务有实现者来解决。也就我们这些编程者来检查的。
帅得不敢出门 2012-03-03
  • 打赏
  • 举报
回复
数组传参退化为指针

要防止越界 得自己做, 系统不会帮你完成。

另外可以用数组的引用来限定数组大小。
面包大师 2012-03-03
  • 打赏
  • 举报
回复
越不越界,不是由你传过去的下标决定的,是由主函数中数组的长度决定的
面包大师 2012-03-03
  • 打赏
  • 举报
回复
(a) 以上三种形式在系统中都是一样的,M的值对计算机来说没有任何意义,
但M的值就还是不要随便写的好,在调用的函数里边,防止数组越界的事情还是要自己做的,比如传个数组长度过去,fun(double (*a)[] ,int n)//用n来记录主函数中数组的长度
,可以不与主函数中的数组s中的M值一样,因为这个[]括号中的值,计算机是不会去看的,有没有都无所谓

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧