关于c ++:当一个函数有一个特定大小的数组参数时,为什么它被一个指针替换?

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的遗产吗?
  • 标准怎么说?
  • 为什么C++的严格类型安全性下降了?

  • 是的,它是从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

    &之后,我们到达开口的(处,所以我们再次反向看向右边。我们现在看到了[100]

    'a' is a reference to an array of 100

    我们再次反向,直到到达char

    'a' is a reference to an array of 100 chars


    对。在C和C++中,不能将数组传递给函数。就是这样。

    你为什么要做普通数组?你看过boost/std::tr1::array/std::arraystd::vector吗?

    但是,请注意,可以将对任意长度数组的引用传递给函数模板。从我的头顶上:

    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