When a function has a specific-size array parameter, why is it replaced with a pointer?
给定以下程序,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #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; } |
输出
1 2 | main() 100 foo() 4 |
号
是的,它是从C继承的。函数:
1 | void foo ( char a[100] ); |
号
将参数调整为指针,因此变为:
1 | void foo ( char * a ); |
如果希望保留数组类型,则应传递对数组的引用:
1 | void foo ( char (&a)[100] ); |
。
C++ 03 83.5/3:
...The type of a function is determined using the following rules. The type of each parameter is determined from its own decl-specifier-seq and declarator. After determining the type of each parameter, any parameter of type"array of T" or"function returning T" is adjusted to be"pointer to T" or"pointer to function returning T," respectively....
号
要解释语法:
在Google中检查"右-左"规则;我在这里找到了一个描述。
它将大致应用于这个示例,如下所示:
1 | void foo (char (&a)[100]); |
从标识符"A"开始
'a' is a
号
向右移动-我们找到一个
'a' is a reference
号
在
'a' is a reference to an array of 100
号
我们再次反向,直到到达
'a' is a reference to an array of 100 chars
号
对。在C和C++中,不能将数组传递给函数。就是这样。
你为什么要做普通数组?你看过
但是,请注意,可以将对任意长度数组的引用传递给函数模板。从我的头顶上:
1 2 3 4 5 6 | template< std::size_t N > void f(char (&arr)[N]) { std::cout << sizeof(arr) << ' '; } |
在C/C++术语中有一个宏伟的词,用于静态数组和函数指针-衰变。考虑以下代码:
1 2 3 4 5 6 7 8 9 | int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints //... void f(int a[]) { // ... } // ... f(intArray); // only pointer to the first array element is passed int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5) int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system |
。