函数原型变量范围C ++

时间:2017-06-04 16:05:23

标签: c++

C ++中函数原型声明中的变量是否被视为全局范围?

E.g。在下面的脚本中,我们声明了readArray的函数原型,它将数组integerArray和整数maxNumElements作为输入,并返回用户提供的元素数。当然,从{main}调用readArray函数。我的问题是displayArray是否可以通过提供用户插入的最大元素数来打印在readArray中编辑的数组。简而言之,integerArraynumElements全球?

/* prototype declaration*/
int readArray (int integerArray [], int maxNumElements);
void displayArray(int integerArray[], int numElements);

int main()
{
    int inputValues[128]; /*the array to be read*/
    int numberOfValues = readArray(inputValues, 128);
    displayArray(inputValues, numberOfValues);
    return 0;
}

int readArray(int integerArray[], int maxNumElements)
{
    int numberOfValues;
    for (numberOfValues = 0; numberOfValues < maxNumElements; numberOfValues++)
    { /*take integers as input from user and insert into array */
       /*return the number of elements the user as provided*/
    }
    return numberOfValues;
}

void displayArray(int integerArray[], int numElements)
{ /*print the array*/
    for (int = 0; i < numElements; i++)
    {
        cout << i << ":" << integerArray[i] << endl;
    }
    cout << endl;
}

3 个答案:

答案 0 :(得分:0)

范围是关于名称可见的位置。例如,全局范围内的名称从声明点到声明它们的翻译单元末尾是可见的;本地范围内的名称从其声明点到声明它们的块的末尾是可见的(即,直到结束})。函数 prototype 中的参数名称仅在原型中可见。传递给函数的参数名称在整个函数中都是可见的。

所以,从你的代码:

int readArray(int integerArray[], int maxNumElements);

在此原型之外,名称integerArraymaxNumElements不可见。

int readArray(int integerArray[], int maxNumElements) {
    // ...
}

名称integerArraymaxNumElements在函数定义中是可见的,但不在其外部。

int displayArray(int intgerArray[], int numElements) {
    // ...
}

名称integerArraynumElements在函数定义中是可见的,但不在其外部。

名称integerArray的三种用法互不相关;它好像每个人都是一个完全不同的名字。

答案 1 :(得分:-1)

我认为将函数参数称为变量是不合理的。它们基本上用作占位符,用于在调用函数时为函数提供的数据。

因此,在您的示例中,您不是在integerArray上运行,而是在操作int inputValues[128]指向的数据,您在main()中声明了这些数据。 inputValue是变量,而不是integerArray

在你的情况下,你碰巧正在做所谓的call-by-reference。即你的函数原型正在接收一个指向整数的指针。将指针inputValues传递给readArray时:

int numberOfValues = readArray(inputValues, 128);

然后你给它地址inputValues。然后,readValues将在inputValues指向的内存区域上运行。

因此,displayArray将在您的示例中显示由readArray编辑的数据。

请注意,这是您通过引用进行调用的结果,而不是函数参数在某种意义上在全局范围内。

如果您的原型功能看起来像这样:

int readArray (vector<int> integerArray);
void displayArray(vector<int> integerArray);

然后displayArray在任何意义上都不会打印integerArray的内容。当您调用readArray时,您将按值执行调用:它将获得inputValues的副本(在这种情况下,它将被声明为vector<int> inputValues)并且在函数调用时返回时,您将保留原始值inputValues,在此特定情况下,displayArray会打印一个空矢量。

答案 2 :(得分:-2)

不,他们不是全球性的。函数在接收参数时创建本地副本。您可以在C ++中通过在复制构造函数中创建自己的带有cout的类来验证这一点。将该类的对象传递给函数(按值),您将看到正在调用的复制构造函数。在C ++中,更好的方法是使用std :: array和std :: vector。对于非原始类型和大数据块,传递值也不是明智之举。始终通过&#34;地址&#34;传递参数。 (指针)或参考&#34;参考&#34; (你可能想读一下std :: ref)