簡體   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