Cpp指针和数组
Cpp pointers and arrays
你能不能帮我理解一下?
我有一个函数需要"char ***argv";
据我所知,它是:指向char指针数组的指针。
这样的:" char * arr [] "?
char xx1 = '1';
char xx2 = '2';
char *argv[] = {&xx1,&xx2};
然后我调用我的函数gtk_init (&argc, &argv);
And get error:
main.cpp:43:31: error: cannot convert ‘char* (*)[2]’ to ‘char***’ for argument ‘2’ to ‘void gtk_init(int*, char***)’
谢谢你的帮助。
char***
是"指向char的指针指向指针的指针"。根本不涉及数组。你的argv
是一个"指向char的2个指针的数组"。在某些情况下,你的数组名称argv
将衰减为指向其第一个元素的指针-该指针的类型将为char**
,或"指向char的指针的指针"。
当你做&argv
时,你会得到一个char* (*)[2]
,或者一个"指向2个指向char的指针数组"。这不是你想要的。这是因为你取的是数组的地址,而不是指针的地址。
此外,您将遇到这样一个问题,即您在argv
中的指针只是指向单个char
s,而不是指向以空结束的字符串。gtk_init
几乎肯定会期望以空结尾的字符串。
那么你能做什么呢?试试这个:
char xx1[] = "1"; // Now these are null-terminated strings
char xx2[] = "2";
char* argv[] = {xx1, xx2};
char** argvp = argv; // Use the fact that the array will decay
gtk_init(&argc, &argv); // &argv will now be a char***
为字符串使用数组的原因是我们需要char
类型为非const,但是不赞成使用char* str = "hello";
类型的声明——必须是const char*
。然而,通过使用数组,字符串字面值的内容被复制到数组中,因此我们可以自由地将其设置为非const
。
gtk_init
实际上只是希望您将主函数的argc
和argv
参数传递给它,如下所示:
int main(int argc, char* argv[])
{
gtk_init(&argc, &argv);
// ...
}
你现在可能会问"但是为什么现在允许&argv
?"argv
与问题中的类型相同!我们为什么不重新得到一个指向数组的指针呢?"实际上,argv
不是同一类型,尽管它看起来很像。当你定义一个接受数组参数的函数时,它实际上被转换成一个指针。因此,main
的定义相当于:
int main(int argc, char** argv);
所以当我们执行&argv
时,我们完全没问题,因为它给了我们一个char***
。
正如@OmnipotentEntity在评论中所说-你最好有一个很好的理由不将main
的参数传递给gtk_init
。
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”