argv上的const char * vs const char **

时间:2018-05-18 00:23:29

标签: c++

我想从命令行参数中获取文件名,因此我可以将其传递给文件打开函数,但是,argv []默认情况下似乎是const char **类型,即使它被定义为“const” char * argv []“在主要的论点中。我的函数需要const char *,有没有办法转换这两个,还是什么?

int main(int argc, const char *argv[]) {
    memory Memory;
    Memory.loadROM(argv); // Error 'argument of type "const char **" is incompatible with parameter of type "const char *"'
}

3 个答案:

答案 0 :(得分:5)

在函数参数中使用而不是参考类型时,const char *argv[]const char **argv 完全相同,因为前者将调整为后者。

根据N4296,第8.3.5p5节:

  

“T的数组”或“返回T的函数”类型的任何参数是   调整为“指向T的指针”或“指向函数返回T的指针”,分别为

因此const char *argv[]是“const char *类型的数组”,因此会调整为“指向const char *”的指针。

由于argv的类型为const char **,因此您需要取消引用它以获得const char *

Memory.loadROM(argv[1])

答案 1 :(得分:2)

argv包含char *数组,因此如果您只想要一个,请简化指定您想要的内容:

Memory.loadROM(argv[1]);

请阅读here,详细了解argv中的内容。

答案 2 :(得分:-1)

char* argv[]char** argv之间的差异实际上非常微妙,因此您经常会看到它们可以互换使用。典型的默认值是char** argv,因为这更常规,但替代方案并不错。

在这两种情况下argv[0]都是第一个参数。请记住,指针的作用类似于数组,char* argv[]char*的数组。