Cpp指针和数组

时间:2012-12-21 23:48:35

标签: c++ arrays pointers

你可以帮我理解这个。

我的功能需要“ 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***)’

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

char***是指向指向char"的指针的"指针。根本没有涉及阵列。你的argv是"指向char"的2指针数组。在某些情况下,数组的名称argv将衰减为指向其第一个元素的指针 - 此指针将具有类型char**或指向char"的指针#34;。

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

此外,您在argv中的指针只指向单个char而不是以空字符结尾的字符串这一事实时,您会遇到问题。 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 s为非const,但不推荐使用char* str = "hello";样式声明 - 它必须是const char*。但是,通过使用数组,字符串文字的内容将被复制到我们的数组中,因此我们可以自由地使它成为非const

gtk_init真的希望您将主要功能的argcargv参数传递给它,如下所示:

int main(int argc, char* argv[])
{
  gtk_init(&argc, &argv);
  // ...
}

你现在可以问"但为什么现在允许&argvargv与问题中的类型相同!为什么我们不再获得指向数组的指针?"实际上,argv不是同一类型,尽管它看起来有多大。当您定义一个采用数组参数的函数时,它实际上会转换为指针。因此main的定义等同于:

int main(int argc, char** argv);

因此,当我们执行&argv时,我们完全没问题,因为它为我们提供了char***

正如@OmnipotentEntity在评论中所说 - 你最好不要将main的参数传递给gtk_init