数组参数传递中的一些问题?

原创 2007年09月18日 09:23:00
  又是公司招聘的时候了,最近很多同学来问我问题,其中一些同学问到了数组传递的问题,其实这个东西重要的是了解编译器为什么这么实现,完全靠记住结论是不可取的,下面个人对这方面的一些见解.
高质量C++编程指南中指出当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针,这句话针对一维数组是正确的(目前个人认为是正确的),但是对于多维数组,这显然不完全正确。C语言之所以把数组形参当作指针是出于效率考虑,如果把一个数组全部拷贝这样势必带来性能上的损失。所以目前无论你在函数声明中像'void func1(char a[])'这样写,还是像'void func1(char *a)',编译器都会把它看成后者的形式。
所以对于一个常考的笔试题目:
Void f(char a[])
{
Cout<<sizeof(a)<<endl;
}
输出结果自然就是4.(默认指针占4位,后面都以此为标准)
对于二维数组情况,二维数组可以表示为多种形式:
(1) char a[m][n] -- 标准形式;
(2) char *p[n] -- 指针数组形式;
(3) char (*p)[n] -- 数组(行)指针的形式
(4) char **p -- 指针的指针的形式
这些形式虽然都能表示二维数组,但是它们并不等价,二维数组作为参数后的转化还是有原则可循的。就是使得在子函数中仍然可以识别出数组行的长度。
(1) char a[m][n] -- void func(char (*p)[n]); 也可以写成void func(char p[][n])(编译器自动将char p[][n]翻译为char (*p)[n]),所以这个时候sizeof(p)=4;sizeof(*p)n;//注意不是4哈。。。
(2) char *a[n] -- void func(char *p[]);也可以写成void func(char **p) ,这个时候sizeof(p)=4,sizeof(*p)=4;
(3) char (*a)[n] -- void func(char (*p)[n]);这个时候sizeof(p)=4,sizeof(*p)=n;
(4) char **a -- void func(char **p);
其实2是一维数组的情况,3是一维数组指针,4是二级指针传递。
上面的*和[]可以互换的,写成p[]的情况可以换为*p,*p可以换为p[],
当可以写为p[]的情况下,在[]中写入任何数情况下都不会对程序构成影响。编译器会将这种情况都转换为*p的情况。
总的原则就是,当你把数组名传入是必须让计算机可以识别出行的长度(数组为二维的情况下)。三维的情况类似,找到规律,所有情况都可以迎刃而解。
                                  注:上面列举的所有情况均在vc6.0下测试通过。
 

perl 传递数组作为参数

#perl #\ ,取地址 sub array {      my ($arr1,$arr2...
  • kelsel
  • kelsel
  • 2016年10月08日 17:19
  • 1022

jquery easyui 传递数组参数的解决方案及jquery easyui 重复请求的解决

传递数组参数function onSearch() { var orderNo = $("#search-orderNo").val(); var status = $("#searc...
  • tszxlzc
  • tszxlzc
  • 2016年12月03日 10:56
  • 1512

数组作为函数参数传递

一、一维数组 二、二维数组
  • u013089125
  • u013089125
  • 2014年04月21日 17:09
  • 7249

Perl函数参数中传递数组和引用的使用

http://developer.51cto.com/art/201007/214024.htm 本文和大家重点讨论一下Perl函数参数中传递数组和引用的使用,今天看到这个问题可以通过传递参...
  • beyondlpf
  • beyondlpf
  • 2014年11月12日 16:36
  • 797

PHP 函数传递基本数据类型和数组的内存传递方式

  • u013372487
  • u013372487
  • 2015年06月27日 14:50
  • 726

一维数组和二位数组作为函数参数进行传递的方式

一维数组的传递 #include //C++将数组名解释为该数组第一个元素的地址,并视函数名为指针 using namespace std; int main() { double chooseMet...
  • Jerry_ICCAS
  • Jerry_ICCAS
  • 2016年04月08日 17:37
  • 1058

JSP向Servlet传递数组参数

今天需要做一个多选删除功能,需要从JSP中获取已勾选的多选框的值,传递到Servlet中进行删除操作。 删除 function delCheckProduct() { ...
  • qq352642663
  • qq352642663
  • 2017年12月09日 22:08
  • 86

二维指针、二维数组、指向数组的指针 函数参数传递

int arr[3][3] 的本质是指向数组的指针即 int  (*p)[3],所以二维数组名可以传递给foo( int (*arr)[3]) ,或者foo(int [][3]),但是不能传递给foo...
  • kimuwu
  • kimuwu
  • 2014年12月27日 22:44
  • 1898

c语言一维数组做参数传递给函数:

今天碰到了一维数组做函数参数的问题,那就扒一扒这个问题: 首先抛结论: 1:C语言中,当一维数组做函数参数时,编译器总是把它解析成一个指向其首元素的指针。 2:实际传递的数组大小与函数形参指定的数...
  • tianjizheng
  • tianjizheng
  • 2015年06月01日 17:55
  • 14950

Python的函数参数传递:传值?引用?

我想,这个标题或许是很多初学者的问题。尤其是像我这样的对C/C++比较熟悉,刚刚进入python殿堂的朋友们 。C/C++的函数参数的传递方式根深蒂固的影响这我们的思维–引用?传值?究竟是那种呢。 语...
  • rommi
  • rommi
  • 2016年03月31日 19:35
  • 2060
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组参数传递中的一些问题?
举报原因:
原因补充:

(最多只允许输入30个字)