繁体   English   中英

char 和 char* 的区别

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM