提问者:小点点

char和char*之间的差异


我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。

我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。

在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该语句将返回char字符串。但是当我尝试将返回放入char数组时,我得到错误“从'char*'到'char'[-Fpermisive]的转换无效”。我也一直在努力弄清楚数组和指向数组的指针,这在我的头脑中仍然是相当模糊的。

这里是我的代码的一些片段,我希望这些片段能够充分展示我正在尝试做的事情。

…从我的主要职能

  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之间的区别。


共2个答案

匿名用户

这一行:

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(或任何T)是对象。

字符*(或任何t*)是指针。

请记住指向第0个元素的指针所显示的数组(char[]或任何t[])。char*的变量可以指向数组的一个元素(在特殊情况下指向第一个元素)。