常量字符 * vs 常量字符 ** 在 argv 上

const char * vs const char ** on argv

本文关键字:常量 字符 argv vs      更新时间:2023-10-16

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

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 *"'
}

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

根据 N4296 第 8.3.5p5 节:

任何类型为"T 数组"或"返回 T 的函数"的参数都是 分别调整为"指向 T 的指针"或"指向返回 T 的函数的指针">

所以const char *argv[]是"一个const char *类型的数组",因此被调整为"指向const char *的指针"。

由于argvconst char **类型,您希望取消引用它以获得const char *

Memory.loadROM(argv[1])

argv包含char *数组,所以如果你只需要一个,简化指定你想要的:

Memory.loadROM(argv[1]);

阅读此处以了解有关argv内容的更多信息。

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

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