【问题标题】:Is "char* string[]" equivalent to "char** string" in C++?“char* string[]”是否等同于 C++ 中的“char** string”?
【发布时间】:2011-11-04 14:58:26
【问题描述】:

char* string[] 是否等同于 C++ 中的 char** string?这两个声明之间到底有什么区别?就内存访问速度而言,最好的声明是什么?

谢谢,

【问题讨论】:

  • 它们是等价的,因为它们都是在 c++ 中表示一组字符串的糟糕方式。在大多数情况下,使用 std::vector<:string> 会更好
  • 我认为他的问题与argc有关,这是上述两个签名之一

标签: c++ pointers char


【解决方案1】:

char * s[] 是一个指针数组。 char ** s 是指向指针的指针。数组和指针不一样,所以两者是不同的。

(真正的是您通常可以将数组视为指向其第一个元素的指针,因此在这两种情况下都可以说s[1][2]。)

请注意,char *s[] 本身实际上并不有效。要么是声明:

const char * s[] = { "hello", "world" };  // really `const char * s[2]`

或者它是一个函数参数,在这种情况下它实际上等同于char**

void foo(char * s[]); // same as `void foo(char ** s)`

【讨论】:

  • 这取决于上下文。如果它们是函数的参数,那么它们是相同的。
  • @KerrekSB s = malloc(sizeof(char) * LEN);
  • @oussama:怎么样?这使您可以将 s 视为指向 char 的(简单)指针,并且您可以取消对 s + 0 的引用,但不包括 s + LEN
  • @oussama:如果sconst char*[],那么我认为将其分配给它没有意义。
【解决方案2】:

char* string[] 可以衰减到 char** string 例如当作为参数按值传递或从函数返回时按值

两者不相同

【讨论】:

    【解决方案3】:

    它们是不同的,但是,在大多数情况下,数组会衰减为指针(例如,当通过值作为参数传递给函数时)。因此,在这种情况下,在此处添加一个索引并收工是完全没问题的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2019-08-22
      • 1970-01-01
      • 2013-07-15
      相关资源
      最近更新 更多