最近,我需要声明一个字符串数组,所以我写下了以下语句:
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[]
之间的区别。
答案 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*
可以指向char
或string
,就像您的情况一样。这会创建个人string constants
,并将每个base address
分配给相应的pointer in the array
char **directories
是指向指针的指针,您无法使用{ .. }