常量字符 * vs 常量字符 ** 在 argv 上
const char * vs const char ** on argv
我想从命令行参数中获取文件名,以便我可以将其传递给文件打开函数,但是,默认情况下,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 *
的指针"。
由于argv
是const 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*
数组。
相关文章:
- 如何循环访问常量字符**?
- constexpr 函数获取常量字符*
- 如何计算常量字符**中的总字符数?
- QDial:如何将 int 值传递给需要常量字符*的 Qfile?
- 为什么 std::string_view 比常量字符*快?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 在编译时将常量字符* 转换为常量 char_type*
- 将字符串数组传递给接受常量字符**的函数
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 字符串强制转换为常量字符*
- 使用常量字符*时退出代码 139
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法<string>从"常量字符 []"转换为<类名>
- 初始化常量字符* 数组
- 常量字符*的性质是什么?
- C++ 获取向量中常量字符* [ ] 的长度
- 无法将参数 1 从 WCHAR 转换为常量字符 *
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- C++将常量字符* 指针数组传递给对象