【问题标题】:what the differences between char** and char*[]char** 和 char*[] 之间有什么区别
【发布时间】:2013-04-03 22:22:20
【问题描述】:

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

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[] 之间的区别。

【问题讨论】:

  • 第一个是指向指针的指针,第二个是指针数组。 { ... } 用于数组(和结构),但不用于指针。这就是你的第一个没有编译的原因。
  • @JoachimPileborg 我觉得深度不够。题目很大,没想到OP看了我的三句话就突然明白了。
  • @john 我知道你在说什么。也许我无法清楚地表达我的问题.. 接受的答案是完美的。谢谢!

标签: c++


【解决方案1】:
= {...};

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

const char**

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

const char*[]

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

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

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2020-06-26
      • 2010-12-14
      • 2012-08-14
      • 2010-10-27
      相关资源
      最近更新 更多