
13

(已解决)为什么C++数组在函数内无法计算正确的元素个数?
source link: https://www.zhihu.com/question/432017816/answer/1595668757
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

(已解决)为什么C++数组在函数内无法计算正确的元素个数?
这个问题别人也问过,但我看答案没找到自己想知道的,因为我想问的是底层的问题。 我知道参数的传递是把实参的值或副本或地址传递给形参,也知道数组传递时只会…
41
18,618
登录一下,更多精彩内容等你发现
贡献精彩回答,参与评论互动
C++程序猿, 公众号:高级开发者
首先main函数内定义的数组a类型其实为数组类型 int[5],目前只有main知道这个长度信息,通过sizeof(int[5]) / sizeof(int)当然可以得到长度5。
至于普通函数为何得不到数组长度信息呢?因为在函数数组通过指针传参过程中,数组类型会退化成指针类型int*,丢失了长度信息。
而传递数组引用可以保留数组类型信息的,这也是你的模板函数fun_a通过引用保留了类型int(&)[5]的原因,从而得知长度。
继续浏览内容

发现更大的世界

Chrome
这引号是什么?
继续浏览内容

发现更大的世界

Chrome

腾讯科技 后台开发工程师
C++要尽可能的兼容C,相同的特性尽量以C语言的为准。
数组在传参(和返回值)的时候退化成指针这个是C语言本身的特性,C++没有改,因为C++需要调用的很多C语言写的API都用了这个特性。
但是对于C++新增的特性,就可以随便改。比如说引用,C语言根本没有引用,C++可以随便改。C++让数组的『引用』不用退化为指针,这样来定义:
void foo(double (&bar)[10])
{
}
想要更通用可以用模板:
template<typename T, size_t N>
void foo(T (&bar)[N])
{
// use N here
}
如果只想考虑纯C++,不想写API给C语言用,那么直接使用std::array即可,可以作为参数、返回值,没有任何退化为指针的疑惑,而且性能上和原始的数组一模一样。
C++改得简单了,但是教程还是在教老的C++。
继续浏览内容

发现更大的世界

Chrome
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK