2

你能帮我理解这一点吗?

我有需要“ char ***argv ”的功能;

据我了解,它是: 指向 char 指针数组的指针

像这样的东西:“ char *arr[] ”?

char xx1 = '1';
char xx2 = '2';
char *argv[] = {&xx1,&xx2};

然后我用gtk_init (&argc, &argv);调用我的函数。

并得到错误:

main.cpp:43:31: error: cannot convert ‘char* (*)[2]’ to ‘char***’ for argument ‘2’ to ‘void gtk_init(int*, char***)’

感谢您的任何帮助。

4

1 回答 1

4

Achar***是“指向指向 char 的指针的指针”。根本不涉及数组。您argv是“2 个指向 char 的指针的数组”。在某些情况下,数组的名称argv, 将衰减为指向其第一个元素的指针 - 该指针将具有 typechar**或“指向 char 的指针的指针”。

当你这样做时&argv,你会得到一个char* (*)[2],或“指向 2 个指向 char 的指针的数组的指针”。这不是你想要的。那是因为您正在获取数组的地址,而不是指针。

此外,您将遇到问题,因为您的指针argv只是指向单个chars,而不是指向以空字符结尾的字符串。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***

对字符串使用数组的原因是因为我们需要chars 是非常量的,但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 在评论中所说 - 你最好有一个很好的借口不传递mainto的参数gtk_init

于 2012-12-21T23:59:48.590 回答