c – 对数组参数感到困惑

这是C Primer第5版的练习,其中包括:

Exercise 6.24: Explain the behavior of the following function. If there are problems in the code, explain what they are and how you might fix them.

void print(const int ia[10])
{
    for (size_t i = 0; i != 10; ++i)
        cout << ia[i] << endl;
}

我在代码中找不到任何问题.这个练习有什么意义?

最佳答案
一般的问题是在C声明语法中,函数参数声明中的数组类型意味着一些非直观的:声明为T []或T [10]或T [1279]的参数实际上声明为T * – 所有这些参数声明是相同的.*

请记住,C中没有数组类型的prvalues,因此数组类型不能是函数参数或返回类型. (当用作prvalue时,数组会衰减到指向其第一个元素的指针.)

因此,您的函数声明实际上是(使用T = const int):

void print(const int *);

此参数类型适用于数组到指针的衰减,但现在很清楚,您可以将任何指向int的指针传递给此函数,并且无法仅从函数定义中确定函数执行的正确性.

*)有点more complicated in C99.

另外,数组glvalues非常精细,下面的函数有一个参数,其类型是“对数组的引用”:

void print10(const int (&a)[10])
{
    for (auto i : a) { std::cout << i << "\n"; }
}

转载注明原文:c – 对数组参数感到困惑 - 代码日志