嵌入式C語言的靈魂--指針--一網打盡

網上講指針的文章很多,這裡全面的總結一下,特別是在提高代碼效率方面,很多人都沒有提及。

嵌入式C語言的靈魂--指針--一網打盡

1.參數傳送與返回

C語言的參數傳送是拷貝傳送,即把變量的值拷貝到函數的臨時變量實現。這就是為什麼當我們需要改變原變量值的時候,需要傳入原變量的指針。其實這個指針參數也是拷貝,只不過拷貝後的臨時指針與原始指針指的是同一個變量位置,所以才能改變原變量的值。

正因為參數傳送是拷貝方式,所以當參數結構比較大的時候,就需要消耗比較多的拷貝運算,此時,採用指針方式就可以大幅減小這個過程。

process(dataType_t * pdata)
{
int a = pdata->var;
pdata->var = 1;
}

當不要禁止改變原結構內容時,加const

process(const dataType_t * pdata)
{
int a = pdata->var;
pdata->var = 1;//無效
}

通用指針 有些時候,我們要定義一個指針,能夠接受任意的數據類型,可以用void,在通信裡面經常用到。

sdData(void* pdata, int len)
{
uint8_t pd=(uint8_t*)pdata;
//發送字節數據
}

2.提高代碼效率

指針的這個功能會被很多人忽視,因為如果不進行代碼反彙編操作,單從C語言代碼執行和調試中是察覺不出來的。只有通過通過查看反彙編代碼,才能真真切切的發現其巨大差異。這種差異在大代碼裡面非常明顯(超過64K的調用),小代碼裡不明顯。

(1)在工程中,我們經常要定義一些全局變量。在C語言裡使用全局變量的時候,和普遍的當地變量局部變量沒有任何差別,但是其實際的編譯代碼,卻會相差很多。簡單的說,大代碼裡,全局變量可能與其調用的位置相差很遠(超過64K),CPU需要更長的指令來實現。這一點在8位單片機裡面最為明顯,像STM8,針對不同的FLASH容量提供了不同的庫函數,而且對全局變量和局部變量專門進行位置設置,都是為了優化代碼提高效率。

(2)對遠程數據結構的訪問,採用指針方式可以提高效率,特別是在運算量大的時候就更加明顯。

//遠程全局變量
extern dataType_t data;
process(void)
{
data.a =3;
data.b =4;
}

採用指針效率更高
process(void)
{
dataType_t * pdata = &data;
pdata->a =3;
pdata->b =4;
}


分享到:


相關文章: