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