覆盖C数组中的第一个元素

时间:2019-03-28 13:33:26

标签: c++ arrays

以下代码有效:

uint8_t test[2] = "7";
cout << test[0];

但是如果我之后添加以下代码,以便将“ 7”更改为“ 5”,那么它将无法正常工作:

test[0] = "5";
cout << test[0];

我得到了错误:

错误:从'const char *'到uint8_t的无效转换

那是为什么?

3 个答案:

答案 0 :(得分:6)

"7"是字符串文字。字符串是字符数组,字符串文字也是。字符串文字可用于初始化其他字符数组。 uint8_t看起来不像字符类型,但实际上是unsigned char的别名。因此,uint8_t test[2]是一个字符数组,可以使用字符串文字对其进行初始化。

test[0]不是字符数组。它是一个字符(特别是它是数组test中的第一个字符)。无法将字符串文字分配给字符。但是,可以在这种情况下为字符分配字符文字:

test[0] = '5';

P.S。 test = "5"也不起作用。数组可以初始化,但是不能分配。

答案 1 :(得分:1)

在初始化时您要说

uint8_t test[2] = "7";

通过使用“”,您告诉程序存储字符串文字,因此test[0](数组的第一个元素)存储7test[1],数组的第二个元素存储\0,它是一个空终止符。空终止符只是告诉您的数组,此刻之后,该数组中不再有其他字符-即使可能存在,如果仍为该数组分配了内存空间(在这种情况下,则没有-数组)声明中只有两个空格)。

现在,

test[0] = "5";

您要告诉我们将5\0存储在uint8_t中。这是不可能的。如果您只想存储字符5,而不是char数组类型的字符串,则需要说

test[0] = '5';

如上所述,将test[0]设置为5后,由于test仍存在于\0上,因此数组test[1]将包含文字字符串“ 5”。您之前的初始化。

还请注意,初始化时无需将数组的大小指定为2。它将自动为自己分配最小大小,以存储带括号的空白字符串文本,该大小仍为2(7\0),如下所示:

uint8_t test[] = "7";           

答案 2 :(得分:0)

您实际上是在将一个字符串放在test[0]所指向的位置。

"5"实际上是字符'5''\0'(“ 5/0”)。
如果要在其中放置角色,请按照以下步骤进行操作。

test[0] = '5';