《C與指針》讀書筆記六
在以前也使用過指針的運算,但是在這本書里作者詳細的介紹了指針的“算數(shù)運算”、“關(guān)系運算”。指針的算數(shù)運算一般是 指針±整數(shù)。實現(xiàn)起來非常簡單,我有位同事在CRC校驗時也使用了。我們可以摘錄一段。
本文引用地址:http://cafeforensic.com/article/201608/295500.htmU16 CRC;
U8 CRCH, CRCL;
U8 *pUNChar;
CRC = out_crc(UART0.RX_buf,UART0.RX_count-2);
pUNChar = &CRC;
CRCH = *(pUNChar++);
CRCL = *pUNChar;
此段代碼在單片機上運行,所以U16是16位無符號整型數(shù)據(jù),也就是unsigned int CRC。U8是一個無符號char型數(shù)據(jù)。 CRC 接收了out_crc( )函數(shù)的返回。也就是一組數(shù)的crc計算結(jié)果。需要將CRC拆分為兩個8位數(shù)據(jù)。我們使用一個pUNChar指針指向該整型數(shù)據(jù)。在單片機中整型高8位存儲在地址,低8位存儲在高地址。
CRCH = *(pUNChar++); 該條語句實現(xiàn)兩個功能。第一將pUNChar指向地址的值賦給CRCH。也就是*(pUNChar)賦給CRCH, 其實就是CRC的高8位賦給CRCH。第二pUNChar自增。也就是pUNChar++。 其實等價于以下兩條語句:
CRCH = *pUNChar;
pUNChar++;
pUNChar++其實就是將pUNChar的值加1。也就是pUNChar指向CRC低8位。
CRCL = *pUNChar;就非常好理解了。將pUNChar地址的值賦給CRCL。簡單快速的實現(xiàn)了一個整型數(shù)據(jù)的拆分。其中用到了指針的加法運算。pUNChar是U8類型,所以pUNChar++是pUNChar值增加1。
加入指針的類型是U16,加法運算會怎樣。這個問題可以實驗獲得。
U16 arrary[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } ;
U16 *pU16;
pU16 = arrary;
pU16++;
pU16 = arrary;是將pU16指向arrary首個成員地址,即arrary[0]的地址。
pU16++是將pU16指向arrary第二個成員地址,即arrary[1]的地址。arrary[1]與arrary[0]地址相差2。因為arrary是U16,2個字節(jié)。所以地址相差為2. pU16++也就使pU16的值增大了2。所以指針的算數(shù)運算的結(jié)果與本身的類型有關(guān)。指針關(guān)系運算其實可以不使用的。比如書中的例子:
#define N_VALUES 5
float values[N_VALUES]
float *vp;
for( vp =&values[0]; vap < &values[N_VALUES];)
*vap++ = 0;
初始化了一個values數(shù)組,并且全部初始化為0。如果按照一般的寫法應(yīng)該為
char i;
for( i =0; i
values[ i ] = 0.0;
再見到作者的實現(xiàn)方法之前,我一直是用這種方法?,F(xiàn)在覺得作者的方法比較簡單。
評論