以下代码有效:
uint8_t test[2] = "7";
cout << test[0];
但是如果我之后添加以下代码,以便将“ 7”更改为“ 5”,那么它将无法正常工作:
test[0] = "5";
cout << test[0];
我得到了错误:
错误:从'const char *'到uint8_t的无效转换
那是为什么?
答案 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]
(数组的第一个元素)存储7
和test[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';