char **和char * []之间的区别是什么

时间:2013-04-03 14:12:37

标签: c++

最近,我需要声明一个字符串数组,所以我写下了以下语句:

const char** directories = {"cricket_batting", "cricket_bowling", "croquet", "tennis_forehand", "tennis_serve", "volleyball_smash"};

然而,g ++向我展示了错误:

error: scalar object ‘directories’ requires one element in initializer

所以我把声明改为:

const char* directories[] = {"cricket_batting", "cricket_bowling", "croquet", "tennis_forehand", "tennis_serve", "volleyball_smash"};

这次是对的。但我无法确切地知道char**char[]之间的区别。

3 个答案:

答案 0 :(得分:9)

= {...};

此表单的初始化称为列表初始化。

const char**

此类型是“指向const char”的指针。

const char*[]

此类型是“指向const char”的指针数组。

简单地说,您无法使用列表初始化初始化指针。 可以使用列表初始化初始化数组;它使用支撑列表中的项初始化数组中的每个元素。

原因归结为你从宣言中得到了什么。当您声明const char**时,您获得的只是一个指针对象。它是一个const char**,它是一个指针,指向指向const char的指针。尽管如此,你实际拥有的只是外部指针。然后你不能将它初始化为它是一个数组,因为你只有一个指针。你究竟要在哪里存储初始化列表的元素?没有可以存储它们的指针数组。

但是,当您声明const char*[]时,您得到的是指针的数组。数组的大小由列表的大小决定,因为你已经省略了它。

答案 1 :(得分:1)

前者是pointer to a pointer to const char,后者是array to pointer to const char。后者是初始化字符串数组的正确方法 您需要使用new分配内存来设置char**,因为您不能简单地使用{ }初始化指针。

答案 2 :(得分:0)

当你写int a[]时,我们正在制作一个整数数组。类似地,当您编写const char* directories[]时,您正在创建一个char*指针数组。现在,每个char*可以指向charstring,就像您的情况一样。这会创建个人string constants,并将每个base address分配给相应的pointer in the array

char **directories是指向指针的指针,您无法使用{ .. }

为指针赋值