函數參數傳遞過程中,怎麼兼容 “const char *類型和“char *類型”的思考。

在使用keil編寫函數時,有一些固定的字符需要顯示,爲了節約內存,我希望把這些固定的字符作爲const常量存放在flash中,在原來使用的函數:

void UpdateTextCtr( u16 ctrid,  char *text, u8 len )

我定義了
const char textstr[] = “abcd” ;
調用函數UpdateTextCtr編譯後出錯,提示 const char* 與char * 不兼容,此時我不想重新寫一個

void UpdateFTextCtr( u16 ctrid,  const char *text, u8 len )

函數,這樣導致我的代碼寫起來太麻煩,以後看起來也麻煩。於是就在想,爲什麼編譯器會報錯?因爲我們定義成char *text,其傳遞的參數是一個指針,在函數內是允許修改的指針所在位置的變量的值的,所以通過常數指針調用函數的時候,編譯器不知道你是否會在函數內修改指針所在位置的變量的值,他認爲char *text指針變量是可修改的。而const char textstr變量是常數,放在flash內的,是不能這樣簡單的修改。
所以,我就想,我把

void UpdateTextCtr( u16 ctrid,  char *text, u8 len );
改成
void UpdateTextCtr( u16 ctrid,  const char *text, u8 len )

這樣一來,編譯器在編譯過程中,認爲傳遞的是常數指針,其內的指針變量是不允許修改的,那麼我們再調用

char teststr2 = “efgh” ;
 UpdateTextCtr( ctrid,  textstr2, 20 )

時,編譯器將不再報錯,並且字符串變量也是可用的,知識在函數內不允許修改變量的值,當然這是對於flash與ram在同一個地址線上的做法,像AVR系列單片機有3組數據地址線是否可行,妒估計夠嗆。
有時候我們換一種思路想想,東西就變得可行了。當然這種做法是不嚴謹的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章