C ++中函数原型声明中的变量是否被视为全局范围?
E.g。在下面的脚本中,我们声明了readArray
的函数原型,它将数组integerArray
和整数maxNumElements
作为输入,并返回用户提供的元素数。当然,从{main}调用readArray
函数。我的问题是displayArray
是否可以通过提供用户插入的最大元素数来打印在readArray
中编辑的数组。简而言之,integerArray
和numElements
全球?
/* 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;
}
答案 0 :(得分:0)
范围是关于名称可见的位置。例如,全局范围内的名称从声明点到声明它们的翻译单元末尾是可见的;本地范围内的名称从其声明点到声明它们的块的末尾是可见的(即,直到结束}
)。函数 prototype 中的参数名称仅在原型中可见。传递给函数的参数名称在整个函数中都是可见的。
所以,从你的代码:
int readArray(int integerArray[], int maxNumElements);
在此原型之外,名称integerArray
和maxNumElements
不可见。
int readArray(int integerArray[], int maxNumElements) {
// ...
}
名称integerArray
和maxNumElements
在函数定义中是可见的,但不在其外部。
int displayArray(int intgerArray[], int numElements) {
// ...
}
名称integerArray
和numElements
在函数定义中是可见的,但不在其外部。
名称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)