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

原创 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下测试通过。
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

关于指针和数组对申请内存malloc和作为参数传递的一些问题

试题1.void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( void ) { char *str = NULL; Get...

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

又是公司招聘的时候了,最近很多同学来问我问题,其中一些同学问到了数组传递的问题,其实这个东西重要的是了解编译器为什么这么实现,完全靠记住结论是不可取的,下面个人对这方面的一些见解. 高质量C++编程...

C++动态申请数组和参数传递问题

最近在做数字视频处理作业时,经常遇到

c语言 关于数组名作参数传递问题

本文以 int  型为例,以函数func为例 (1)将一维数组名  iExamC 作为参数传递情况, void func( int p [ ], int n ){ /...

二维数组作为形参的参数传递问题

首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅):   [原文开始]   可以用二维数组名作为实参或者形参,在被...

二维数组作为参数传递问题

int a[2][2]={ {4, 6}, {9, 11} }; 我定义了这样一个数组,我想把这个数组作为参数,传递到一个函数中,并要在函数中能引用该二维数组的元素,我该怎么做?   第一种...

C++中关于二维数组作为函数参数传递的问题

在做数据结构迷宫实验的时候,要生成一个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进一个函数migongsc()里。大致代码如下:         问题的...

关于在C/C++语言中,函数如何返回数组,数组如何作为参数传递以及返回数组的函数该如何调用问题的总结

可能很多初学者对C语言中(C++类似),数组作为参数传递,和一个函数如何返回一个数组这类问题很迷惑,因为这里面涉及到指针问题,而初学者对指针了解甚少,更别说使用了。我也是刚刚需要实现一个简单算法才用到...

数组作为参数传递的方式

在把数组作为参数传递给函数时,有值传递(byvalue)和地址传递(byreference)两种方式。     一值传递: 在值传递方式中,要在数组参数的尾部加上一对方括号([]),调用函...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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