CsT*_*mas 65 c++ arrays standards sizeof function-parameter
鉴于以下计划,
#include <iostream>
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;
}
Run Code Online (Sandbox Code Playgroud)
输出
main() 100
foo() 4
Run Code Online (Sandbox Code Playgroud)
Ric*_*den 78
是的,它继承自C.功能:
void foo ( char a[100] );
Run Code Online (Sandbox Code Playgroud)
将参数调整为指针,因此变为:
void foo ( char * a );
Run Code Online (Sandbox Code Playgroud)
如果您希望保留数组类型,则应传入对该数组的引用:
void foo ( char (&a)[100] );
Run Code Online (Sandbox Code Playgroud)
C++ '03 8.3.5/3:
...使用以下规则确定函数的类型.每个参数的类型由其自己的decl-specifier-seq和声明符确定.在确定每个参数的类型之后,将"T的数组"或"返回的函数T"的任何参数分别调整为"指向T的指针"或"指向返回T的函数的指针"....
解释语法:
检查谷歌中的"右 - 左"规则; 我在这里找到了一个描述.
它将大致如下应用于此示例:
void foo (char (&a)[100]);
Run Code Online (Sandbox Code Playgroud)
从标识符'a'开始
'a'是一个
向右移动 - 我们发现了一个)反方向寻找的方向(.当我们向左移动时,我们通过&
'a'是一个参考
在&我们到达开口后(,我们再次反转,看起来正确.我们现在看到了[100]
'a'是对100的数组的引用
我们再次反向,直到达到char:
'a'是对100个字符数组的引用
sbi*_*sbi 13
是.在C和C++中,您无法将数组传递给函数.就是那样子.
你为什么要做普通阵列呢?你看过boost/ std::tr1::array/ std::array或std::vector?
但请注意,您可以将对任意长度的数组的引用传递给函数模板.脱离我的头顶:
template< std::size_t N >
void f(char (&arr)[N])
{
std::cout << sizeof(arr) << '\n';
}
Run Code Online (Sandbox Code Playgroud)