鉴于以下程序,
#include
using namespace std;
void foo( char a[100] ) { cout << "foo() " << sizeof( a ) << endl; }
int main() { char bar[100] = { 0 }; cout << "main() " << sizeof( bar ) << endl; foo( bar ); return 0; } 输出
main() 100 foo() 4 为什么将数组作为指向第一个元素的指针传递? 它是C的遗产吗? 标准怎么说? 为什么严格的C ++类型安全性下降了? 问题来源于stack overflow
是的,它是从C继承的。函数:
void foo ( char a[100] ); 将参数调整为指针,因此变为:
void foo ( char * a ); 如果要保留数组类型,则应传递对数组的引用:
void foo ( char (&a)[100] ); C ++ '03 8.3.5 / 3:
...使用以下规则确定函数的类型。每个参数的类型由其自己的decl-specifier-seq和声明符确定。在确定每个参数的类型之后,将类型为“ T的数组”或“返回T的函数”的任何参数分别调整为“指向T的指针”或“返回T的函数指针”。
解释语法:
在Google中检查“左右”规则;我在这里找到了一个描述。
它将大致应用于以下示例:
void foo (char (&a)[100]); 从标识符“ a”开始
'a'是一个
向右移动-我们找到一个,)因此我们反方向寻找(。当我们向左移动时,我们经过&
“ a”是参考
在&到达开口处之后,我们(再次反转并向右看。现在我们看到[100]
'a'是对100数组的引用
然后我们再次反转方向,直到到达char:
'a'是对100个字符的数组的引用
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。