單片機C語(yǔ)言教程:C51指針的使用
指針就是指變量或數據所在的存儲區地址。如一個(gè)字符型的變量 STR 存放在內存單元DATA 區的 51H 這個(gè)地址中,那么 DATA 區的 51H 地址就是變量 STR 的指針。在 C 語(yǔ)言中指針是一個(gè)很重要的概念,正確有效的使用指針類(lèi)型的數據,能更有效的表達復雜的數據 結構,能更有效的使用數組或變量,能方便直接的處理內存或其它存儲區。指針之所以 能這么有效的操作數據,是因為無(wú)論程序的指令、常量、變量或特殊寄存器都要存放在內 存單元或相應的存儲區中,這些存儲區是按字節來(lái)劃分的,每一個(gè)存儲單元都能用唯一的 編號去讀或寫(xiě)數據,這個(gè)編號就是常說(shuō)的存儲單元的地址,而讀寫(xiě)這個(gè)編號的動(dòng)作就叫做尋 址,通過(guò)尋址就能訪(fǎng)問(wèn)到存儲區中的任一個(gè)能訪(fǎng)問(wèn)的單元,而這個(gè)功能是變量或數組等 是不可能代替的。C 語(yǔ)言也因此引入了指針類(lèi)型的數據類(lèi)型,專(zhuān)門(mén)用來(lái)確定其他類(lèi)型數據的 地址。用一個(gè)變量來(lái)存放另一個(gè)變量的地址,那么用來(lái)存放變量地址的變量稱(chēng)為“指針變量”。 如用變量 STRIP 來(lái)存放文章開(kāi)頭的 STR 變量的地址 51H,變量 STRIP 就是指針變量。下面 用一個(gè)圖表來(lái)說(shuō)明變量的指針和指針變量?jì)蓚€(gè)不一樣的概念。
本文引用地址:http://dyxdggzs.com/article/170572.htm
變量的指針就是變量的地址,用取地址運算符‘’取得賦給指針變量。STR 就是把 變量 STR 的地址取得。用語(yǔ)句 STRIP = STR 就能把所取得的 STR 指針存放在 STRIP 指 針變量中。STRIP 的值就變?yōu)?51H??梢?jiàn)指針變量的內容是另一個(gè)變量的地址,地址所屬的 變量稱(chēng)為指針變量所指向的變量。
要訪(fǎng)問(wèn)變量 STR 除了能用‘STR’這個(gè)變量名來(lái)訪(fǎng)問(wèn)之外,還能用變量地址來(lái)訪(fǎng) 問(wèn)。方法是先用STR 取變量地址并賦于 STRIP 指針變量,然后就能用*STRIP 來(lái)對 STR 進(jìn)行訪(fǎng)問(wèn)了。‘*’是指針運算符,用它能取得指針變量所指向的地址的值。在上圖中指針 變量 STRIP 所指向的地址是 51H,而 51H 中的值是 40H,那么*STRIP 所得的值就是 40H。 使用指針變量之前也和使用其它類(lèi)型的變量那樣要求先定義變量,而且形式也相類(lèi)似,
一般的形式如下:
數據類(lèi)型 [存儲器類(lèi)型] * 變量名;
unsigned char xdata *pi //指針會(huì )占用二字節,指針自身存放在編譯器默認存儲區,指
向 xdata 存儲區的 char 類(lèi)型
unsigned char xdata * data pi; //除指針自身指定在 data 區,其它同上
int * pi; //定義為一般指針,指針自身存放在編譯器默認存儲區,占三個(gè)字節 在定義形式中“數據類(lèi)型”是指所定義的指針變量所指向的變量的類(lèi)型。“存儲器類(lèi)型”是編譯器編譯時(shí)的一種擴展標識,它是可選的。在沒(méi)有“存儲器類(lèi)型”選項時(shí),則定義為一般指針,如有“存儲器類(lèi)型”選項時(shí)則定義為基于存儲器的指針。限于 51 芯片的尋址范圍,指針變量最大的值為 0xFFFF,這樣就決定了一般指針在內存會(huì )占用 3 個(gè)字節,第一字節存 放該指針存儲器類(lèi)型編碼,后兩個(gè)則存放該指針的高低位址。而基于存儲器的指針因為不用 識別存儲器類(lèi)型所以會(huì )占一或二個(gè)字節,idata,data,pdata 存儲器指針占一個(gè)字節,code,xdata 則會(huì )占二個(gè)字節。由上可知,明確的定義指針,能節省存儲器的開(kāi)銷(xiāo),這在嚴格要求程序 體積的項目中很有用處。
指針的使用方法很多,限于篇幅以上只能對它做一些基礎的介紹。下面用在講述常量時(shí)的例程改動(dòng)一下,用以說(shuō)明指針的基本使用方法。
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
存儲器相關(guān)文章:存儲器原理
評論