当前位置: 首页 > 知识库问答 >
问题:

char和char*之间的差异

孔彭祖
2023-03-14

我正在通过做微控制器项目来自学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个答案

楚望
2023-03-14

char(或任何T)是对象。

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

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

胡墨竹
2023-03-14

这一行:

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];
 类似资料:
  • 刚从C开始,我想知道是否有人能解释一些事情。 我相信你可以用下面的方法初始化一个字符数组 这将创建一个字符数组,其值为。 但如果我真的创造了这个: 会创建一个数组,以及指向该数组的指针吗? 例如:将指向内存中的第一个元素,以及数组中的其他元素?

  • 当我试图打印未初始化的静态字符数组时,它会给出运行时错误(Null指针异常),而未初始化的静态int数组会给出Null值。为什么?

  • 描述 (Description) C库函数char *strtok(char *str, const char *delim)使用分隔符delim将字符串str分解为一系列标记。 声明 (Declaration) 以下是strtok()函数的声明。 char *strtok(char *str, const char *delim) 参数 (Parameters) str - 修改此字符串的内容

  • 描述 (Description) C库函数char *strcpy(char *dest, const char *src)将char *strcpy(char *dest, const char *src)指向的字符串复制到dest 。 声明 (Declaration) 以下是strcpy()函数的声明。 char *strcpy(char *dest, const char *src) 参数

  • 描述 (Description) C库函数char *strcat(char *dest, const char *src)将char *strcat(char *dest, const char *src)指向的字符串追加到dest指向的字符串的末尾。 声明 (Declaration) 以下是strcat()函数的声明。 char *strcat(char *dest, const char *

  • 描述 (Description) C库函数char *gets(char *str)从stdin读取一行并将其存储到str指向的字符串中。 当读取换行符或达到文件结尾时(以先到者为准),它会停止。 声明 (Declaration) 以下是gets()函数的声明。 char *gets(char *str) 参数 (Parameters) str - 这是指向存储C字符串的字符数组的指针。 返回值