[英]Difference between char and char*
我通过做微控制器项目自学 C++。 我目前的项目是使用一对或 Adafruit Feather 数据包无线电。 无线电数据包的库函数需要一个 C 风格的字符串(我相信),我理解它是一个字符数组。
我已经设置了一个枚举来反映接收器的各种操作,并希望将该状态发送回发送器。 所以我想把一个枚举变成一个字符数组。
在谷歌搜索将枚举转换为字符数组的方法中,最简单的(对我来说理解)是将枚举变量传递给 function 并带有一个返回字符字符串的 switch 语句。 但是当我尝试将返回值放入我的 char 数组时,我收到错误“从 'char*' 到 'char' [-fpermisive] 的无效转换”。 我也一直在努力理解 arrays 和指向 arrays 的指针,这在我的脑海中仍然很模糊。
以下是我的一些代码片段,我希望它们能充分展示我正在尝试做的事情。
...来自我的主要 function
BLINKING_RIGHT, //0
BLINKING_LEFT, //1
FLASHING, //2
SHOWING_BATTERY,//3
NONE //4
};
...以及处理要发送的枚举的两个函数
void SendStatus()
{
char data[20] {EnumToString(currentAction)}; //This is the line showing the error
//itoa (data,static_cast<int>(currentAction),10);
//data[0]=static_cast<uint8_t>(currentAction);
//data[1]=0;
rf69.send(data, sizeof(data));
rf69.waitPacketSent();
Serial.println("Sent a reply");
}//end_function SendStatus()
char* EnumToString(CurrentAction inputEnum)
{
char *statusString;
switch(inputEnum)
{
case 0:
statusString = "BLINKING_RIGHT"; //0
return statusString;
break;
case 1:
statusString = "BLINKING_LEFT"; //1
return statusString;
break;
case 2:
statusString = "FLASHING"; //2
return statusString;
break;
case 3:
statusString = "SHOWING_BATTERY";//3
case 4:
statusString = "NONE"; //4
return statusString;
break;
default:
return "EnumToString: Invalid enum";
}
}
我想帮助解决这个问题,更重要的是,帮助理解 char* 类型和 char 类型之间的区别。
这一行:
char data[20] {EnumToString(currentAction)};
是错误的,因为它使用数组初始化来用字符串( char*
)初始化char
数组的第一个元素(第一个char
类型的元素)。 你想要做的是这样的:
char data[20];
strcpy(data, EnumToString(currentAction));
或者简单地说:
char *data = EnumToString(currentAction);
后者不涉及任何类型的复制,效率在微控制器上很重要。
虽然我们在效率方面,但将顺序枚举值映射到字符串的规范方法是使用数组,这比重复分支效率高几个数量级:
// stored as read-only data in the .hex file
static char *names[] = { "BLINKING_RIGHT", "BLINKING_LEFT", "FLASHING", "SHOWING_BATTERY", "NONE" };
// later
const char *data = names[currentAction];
char 和 char* 的区别
char
是一个字符 object。 字符是数字。 数字值对一些文本字符进行编码(在固定宽度字符编码中;一个 C++ 字符表示可变宽度 unicode 编码中的一个“代码单元”)。
char*
是一个指针 object。 它特别是指向char
object 的指针。 A pointer object points to another object in memory - or points to nothing if null or points to memory where an object was if the pointer is invalid. 指针也是迭代器,递增指针使其指向数组的连续元素。
char data[20] {EnumToString(currentAction)}; //This is the line showing the error
data
是一个包含 20 个char
类型对象的数组。 {expr}
用表达式初始化数组的第一个元素。 在您的情况下,表达式是对EnumToString
的调用。 因此,您尝试使用 function 返回的char*
object 来初始化char
object。 C++ 的类型系统可以保护您免受这个明显错误的影响。
假设您可以选择发送少于 20 个字节,一个潜在的简单解决方案是完全避免使用本地数组:
std::string_view str = EnumToString(currentAction);
rf69.send(str.data(), str.size());
char *statusString; statusString = "BLINKING_RIGHT"; //0
这在 C++ 中格式不正确。 字符串文字是const char
的 arrays ,它们不能转换为指向非 const char
的指针(C++11 起)。
简单的解决方法是将变量和返回类型更改为const char*
。 也就是说,使用std::string_view
可能更可取,因为这样调用者不需要在运行时通过搜索 null 终止符来计算字符串的长度。
char
(或任何 T)是一个值。
char*
(或任何T*)是一个指针(一个指向另一个值的值,即地址)。
请记住指向第 0 个元素的指针所呈现的 arrays ( char[]
或任何T[]
)。 char*
的变量可以指向数组的一个元素(在特殊情况下指向第一个元素)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.