5

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

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[]

4

3 回答 3

9
= {...};

这种形式的初始化称为列表初始化。

const char**

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

const char*[]

这种类型是一个“指针数组const char”。

简而言之,您不能使用列表初始化来初始化指针。您可以使用列表初始化来初始化数组;它使用花括号列表中的项目初始化数组中的每个元素。

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

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

于 2013-04-03T14:15:10.473 回答
1

前者是一段pointer to a pointer to const char时间,后者是一个array to pointer to const char。后者是初始化字符串数组的正确方法。
您需要使用 to setup 分配内存newchar**因为您不能简单地使用{ }.

于 2013-04-03T14:16:17.163 回答
0

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

char **directories是指向指针的指针,您不能使用{ .. }

于 2013-04-03T14:22:20.983 回答