在void函数和主程序中使用相同的参数名称

时间:2016-12-06 22:36:48

标签: c++ variables arguments

我一直想知道我是否可以在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;
}

这是我的第一篇文章,我试图在整个论坛中搜索我的问题,但没有一个帮助过我。

4 个答案:

答案 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;。

我建议你学习更深入的功能,范围和参考资料,以掌握这部分语言。一些有用的链接:

  1. http://www.cplusplus.com/doc/tutorial/functions/
  2. http://www.cprogramming.com/tutorial/references.html

答案 2 :(得分:0)

使用&amp;

通过引用传递值
void fill(int &a, int &b, int &n, int * tab) 

这将通过引用传递而不是复制,并将编辑main中的原始变量。指针自动通过引用传递,因此选项卡应该没问题

答案 3 :(得分:0)

您需要通过引用传递值或使用指针;但第一个解决方案更容易