开发者社区> 问答> 正文

当函数具有特定大小的数组参数时,为什么将其替换为指针?

鉴于以下程序,

#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

展开
收起
保持可爱mmm 2020-02-09 12:00:30 482 0
1 条回答
写回答
取消 提交回答
  • 是的,它是从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个字符的数组的引用

    2020-02-09 12:00:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载