功能原型变量范围C

function prototype variable scope C++

本文关键字:范围 变量 原型 功能      更新时间:2023-10-16

是函数原型声明中的变量C 在范围中被认为是全局吗?

例如。在下面的脚本中,我们声明了readArray的功能原型,该函数原型将数组integerArray和Integer maxNumElements作为输入,并返回用户提供的元素数量。当然,readArray函数从MAIN调用。我的问题是displayArray是否可以通过提供用户插入的最大元素来打印readArray中编辑的数组。简而言之,integerArraynumElements Global?

/* 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;
}

范围是关于可见名称的位置。例如,从声明的角度到宣布其宣布的翻译单元的末尾,可以看到全球范围中的名称;从其声明点到声明其声明的块末尾(即,直到关闭}(,可以看到本地范围中的名称。函数原型中的参数名称仅在原型中可见。在该函数中可见传递给函数的参数的名称。

所以,从您的代码中:

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

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

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

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

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

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

名称integerArray的三种用途彼此没有连接;好像他们每个人都是一个完全不同的名称。

我认为将函数参数作为变量没有意义。它们基本上是您调用功能将提供给该功能的数据的占位符。

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

在您的情况下,您碰巧正在执行所谓的逐回电。IE。您的功能原型正在接收到整数的指针。当您将指针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将打印一个空的向量。

不,它们不是全局。函数在接收参数时创建本地副本。您可以通过在复制构造函数中使用COUT创建自己的课程来在C 中验证这一点。将该类的对象传递到函数(按值(,您将看到复制构造函数被调用。在C 中,更好的方法是使用STD :: Array和STD :: vector。同样,按价值传递并不是非重要类型和巨大数据块的明智想法。始终通过"地址"(指示(或"参考"传递参数(您可能需要阅读有关std :: Ref(