数组作为函数参数 自动转换为同类型指针
来源:互联网 发布:首都国旅网络旗舰店 编辑:程序博客网 时间:2024/06/02 21:32
高质量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下测试通过。
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/2007925/73641.html
- 数组作为函数参数 自动转换为同类型指针
- 当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针!
- 数组、指针作为函数参数
- 以数组作为函数参数退化为指针
- 数组作为参数时,退化为指针。
- 指针类型作为成员函数的参数
- 指针类型作为成员函数的参数
- 指针类型作为成员函数的参数
- 指针类型作为成员函数的参数
- 一维数组转换为同类型的指针的一些试验结果
- 数组作为函数参数的指针问题
- 数组作为函数参数、scanf初始化指针
- 指针作为函数参数
- 指针作为函数参数
- 指针函数作为参数
- 指针作为函数参数
- 指针作为函数参数
- 函数指针作为参数
- asp/aspx/htm和html的区别
- free的使用
- SQL Server中的cast和Convert的用法
- 一个使用itext导出pdf的例子
- 一个使用itext导出pdf的例子
- 数组作为函数参数 自动转换为同类型指针
- 获取SQL Server元数据的几种方法
- 使用Oracle 10g中的等待界面诊断性能问题(查询会话等待,查询慢的现象)
- SQL Server CHARINDEX和PATINDEX详解
- 内存泄漏和内存溢出
- asp.net的登录验证方法 Web.config 的作用范围 拒绝与巧用允许 访问权限
- asp.net的登录验证方法 Web.config 的作用范围 拒绝与巧用允许 访问权限
- 关于实现魔方复原的Thistlethwaite Algorithm
- sql server 2005 数据库关系图 开不了