C/C++将char数组初始化为const char*

jde*_*dex 2 c++ arrays initialization

假设我有一个char数组,这没关系:

char myChars[100] = "hello";
Run Code Online (Sandbox Code Playgroud)

但如果我有一个

const char* hello="hello";
char myChars[100] = hello;
Run Code Online (Sandbox Code Playgroud)

要么

const char hello[6]="hello";
char myChars[100] = hello;
Run Code Online (Sandbox Code Playgroud)

这不被允许:

error: array must be initialized with a brace-enclosed intializer
Run Code Online (Sandbox Code Playgroud)

在我看来,这些基本上是等价的陈述,为什么会这样呢?

Lig*_*ica 7

因为指针不是数组,而数组不是指针.

这些例子并不等同; 字符串文字"hello"不是指针,而是a const char[6],可用于初始化您char myChars[100]的特殊情况.

但是,如果你首先让它衰减到一个指针,那么你以后就不能再回到那个数组了.在一般情况下,编译器无法知道数组的大小,或者甚至是一个数组.因此,无论以前发生什么,从指针初始化数组都是无效的.

  • @jdex。不,你需要像电脑一样思考。`char myChars[100] = "hello";` 说创建一个包含 100 个元素的数组,然后让语法糖,[使事情更容易的特殊规则](https://en.wikipedia.org/wiki/Syntactic_sugar),初始化如果是字符串文字,则带有副本。`char myChars[100] = hello;` 说创建一个 100 个字符的数组并尝试用一个指针初始化它。没有语法糖来实现从指针到 `char` 到指向字符串文字的最后一次逻辑飞跃。 (2认同)

Tho*_*ews 5

您需要区分指针数组

下面定义了一个指向常量文本的指针:
const char* hello="hello";

下面定义了一个数组:
char myChars[100];

您正在尝试将指针分配给数组的单个槽:
char myChars[100] = hello;

你最好的选择是使用std::string.

在嵌入式编程中,我经常使用:
static const char hello_text[] = "Hello";

我让编译器确定数组的大小。

  • *您正在尝试将指针分配给数组的单个槽:*:不是真的。这不是赋值,而是初始化,并且指针不是“char”数组的正确初始化器。 (2认同)