【问题标题】:C++ Difference Between const char* and const char[]C++ const char* 和 const char[] 的区别
【发布时间】:2013-09-04 23:57:48
【问题描述】:

我读了一个关于两者区别的问题:

const char*

const char[]

有一段时间,我认为数组只是指针的语法糖。 但是有些事情困扰着我,我有一段类似于以下的代码:

namespace SomeNamespace {
    const char* str = { 'b', 'l', 'a', 'h' };
}

我明白了,错误:缩放器对象“str”在初始化程序中需要一个元素。 所以,我尝试了这个:

namespace SomeNamespace {
    const char str[] = { 'b', 'l', 'a', 'h' };
}

它起作用了,起初我认为这可能与应用了额外操作有关 当它是一个 const char* 时,GCC 从不喜欢在函数之外执行操作(无论如何这都是不好的做法),但错误似乎并不表明如此。 然而在:

void Func() {
    const char* str = { 'b', 'l', 'a', 'h' };
}

它按预期编译得很好。有谁知道为什么会这样?

x86_64/i686-nacl-gcc 4(.1.4?) pepper 19 工具链(基本上是 GCC)。

【问题讨论】:

  • 一个是数组,一个是指针。
  • ...如果您认为它们相同,请三思。
  • @WhozCraig 就像我说的,我读了一个问题,解释它们是不同的(以前我认为数组是指针的语法糖,基本上是重载运算符的集合)。
  • 最后一个 sn-p 也 not 在我的 clang 上编译(Apple LLVM 4.2,clang-425.0.28)所以我不知道你的怎么了。 (错误:“缩放器初始化程序中的多余元素”),但我没想到会这样。
  • 我建议您参考 C 常见问题解答:c-faq.com/aryptr/aryptrequiv.html

标签: c++ gcc c++11 char google-nativeclient


【解决方案1】:

首先,如果您尝试在命名空间范围或函数中使用复合初始化,这并没有什么不同:两者都不应该起作用!当你写

char const* str = ...;

你有一个指向chars 序列的指针,例如,可以用字符串字面量进行初始化。在任何情况下,chars 都位于指针之外的其他位置。另一方面,当你写

char const str[] = ...;

您定义了一个chars 数组。数组的大小由右侧元素的数量决定,例如,在您的示例{ 'b', 'l', 'a', 'h' } 中变为 4。例如,如果您使用 "blah",则大小当然是 5。在这种情况下,数组的元素将复制到定义 str 的位置。

注意char const x[]可以在某些情况下等同于写char const* x:当你声明一个函数参数时,char const x[]实际上和char const*是一样的。

【讨论】:

  • 当你写“是一样的” 是不是应该说“可以隐式转换”
  • 我不知道这在不同的情况下会有不同的行为,谢谢你澄清这个问题!
  • @IInspectable 关于 typedefs,是逐个实例还是根据类型声明?
  • @IInspectable: 否。声明为 char const x[]char const* x 的函数参数是相同的。但是,当用作typdefs 时,它们实际上不同的,但我还没有完全弄清楚如何。这是一个测试:void f(char const x[], char const* y) { std::cout << std::is_same<decltype(x), decltype(y)>::value << '\n'; }.
  • @DietmarKühl Modified example 来展示我认为您所说的关于 typedef 的差异(奇怪的是,相同)。那是一个真正的面条面包师。我想我可能终于找到了我的第一个 SO 问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-11-05
  • 2012-04-07
  • 1970-01-01
  • 2013-04-23
  • 2010-10-27
  • 2011-02-25
相关资源
最近更新 更多