我一直想知道我是否可以在void函数和main函数中使用相同的参数名称。
当我在void函数(int x,int y等)中使用不同的参数名称并在程序本身中更改变量的名称时,程序运行相同,但我想知道我是在处理原始变量还是只是他们的副本。
例如,如果我在fill()函数中分配整数b,一个不同的值,它将不会全局更改它的值。为什么我可以为表分配新值并在full()内部使用循环分配新值:fill()和main()函数中是否可以分配新值?
void fill(int a, int b, int n, int * tab) {
for (int i=0; i<n; i++) {
tab[i] = a+rand()%(b-a+1);
std::cout << tab[i] << " ";
}
}
int main() {
srand(static_cast<unsigned int>(time(NULL)));
int tab[999];
int n = 999;
int a = 4;
int b = 10;
fill(a, b, n, tab);
return 0;
}
这是我的第一篇文章,我试图在整个论坛中搜索我的问题,但没有一个帮助过我。
答案 0 :(得分:1)
当您使用c ++编写方法或函数时:
void foo(int bar)
你做了一个“按值调用”。这意味着您复制给予函数的参数值并将其分配给新变量。 如果您确实想要访问原始变量,则需要执行“按引用调用”:
void foo(int& bar)
另一个是名称:变量的范围通常在{}
括号内,因此局部变量的范围(通过函数声明)始终只是函数。
答案 1 :(得分:1)
假设这个功能:
void changeValue( int value ) {
++value;
}
无论何时调用此函数,它都会将您传递的任何值作为参数,并将其分配给value
。基本上,函数调用正在创建一个名为value
的变量,其初始化值将是您作为参数传递的任何内容的评估结果。同样的value
变量在超出范围时将被销毁,即当函数命中它的结束括号或函数将控制返回给调用者时。由于您要更改的是在调用函数时创建的变量,因此它不会影响您作为参数传递的任何内容,因为:
int x{5};
changeValue( x ); // The 'x' argument will evaluate to five when passing it as an argument
请记住,您可以将表达式作为参数传递给函数,例如&#39; 3&#39;或者&#39; 4 + 6&#39;
它将评估相应的值,然后使用相同评估的结果初始化changeValue中的value
参数。这称为:&#34;按值传递&#34;。
如果你想改变你作为参数传递的变量本身的值,那么你的函数应该是这样的:
void changeValue( int &value ) {
++value
}
当然,您需要将变量作为参数传递。这称为:&#34;通过引用传递&#34;。
我建议你学习更深入的功能,范围和参考资料,以掌握这部分语言。一些有用的链接:
答案 2 :(得分:0)
使用&amp;
通过引用传递值void fill(int &a, int &b, int &n, int * tab)
这将通过引用传递而不是复制,并将编辑main中的原始变量。指针自动通过引用传递,因此选项卡应该没问题
答案 3 :(得分:0)
您需要通过引用传递值或使用指针;但第一个解决方案更容易