通过引用传递argv [1]

时间:2011-09-28 06:28:20

标签: c++

将argv传递给函数时遇到了问题。基本上,我想将& argv [1]传递给函数并从中工作。但是,我不明白为什么以下方法有效:

    void fun(char**&argv, const int& argc);

    int main(int argc, char** argv)
    {
            fun(++argv, --argc);
            return 0;
    }

但以下情况不起作用:

    void fun(char**&argv, const int& argc);

    int main(int argc, char** argv)
    {
            fun(&argv[1], --argc);
            return 0;
    }

2 个答案:

答案 0 :(得分:1)

原型:

void myfunc (char **argv, int argc)

使用示例:

  myfunc (argv, argc)

如果你想传递一个字符串(argv [1]):

void myfunc (char *arg, int argc)
...
myfunc (argv[1], argc)

如果你想在argv [1]传递开始的字符串数组:

void myfunc (char **arg, int argc)
...
myfunc (&argv[1], argc)

答案 1 :(得分:1)

我尝试这个时得到的错误是argv [1]是一个临时值,你不能将它分配给非const引用。如果你这样做:

void fun( char** const&argv, const int& argc);

然后,++argv&argv[1]将有效。

显然,如果您计划实际更改argv本身的值,这将不起作用,但我认为您不打算这样做,因为您没有传递对argv本身的引用,而是传递给argv中第二个条目的内存位置。

第一个工作原理而第二个不工作的原因是前面的++运算符修改变量,然后返回修改后的值,而不是变量本身。因此,变量可以作为参考传递给乐趣。但&argv[1]只是内存位置的值。它是一个计算值,而不是一个变量,因此它不能作为非const引用传入。

如果您打算尝试更改argv本身的值(将其指向不同的字符数组数组),那么&argv[1]无论如何都不起作用,因为它是不是argv。然而,++argvargv,就在它调整了价值之后。

你也可以在没有引用的情况下处理所有这些,这会让事情变得更容易,但这取决于你。如果这是我的代码,我不会在这里使用引用。对int的const引用只能通过值传递(这会更容易),并且将引用传递给双指针不会保存任何空检查(因为它仍然可以为null)。所以没有太多意义。但如果您希望代码复杂,请随意。