前邊我們提到了,指針的意義往往在小程序里是體現(xiàn)不出來的,對于簡單程序來說,有時(shí)候用了指針,反而可能比沒用指針還麻煩,但是為了讓大家鞏固一下指針的用法,我還是寫了個(gè)使用指針的流水燈程序,目的是讓大家從簡單程序開始了解指針,當(dāng)程序復(fù)雜的時(shí)候不至于手足無措。
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void ShiftLeft(unsigned char *p);
void main(){
unsigned int i;
unsigned char buf = 0x01;
ENLED = 0; //使能選擇獨(dú)立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
while (1){
P0 = ~buf; //緩沖值取反送到 P0 口
for (i=0; i<20000; i++); //延時(shí)
ShiftLeft(&buf); //緩沖值左移一位
if (buf == 0){ //如移位后為0則重賦初值
buf = 0x01;
}
}
}
/* 將指針變量 p 指向的字節(jié)左移一位 */
void ShiftLeft(unsigned char *p){
*p = *p << 1; //利用指針變量可以向函數(shù)外輸出運(yùn)算結(jié)果
}
這是一個(gè)使用指針實(shí)現(xiàn)流水燈的例子,純粹是為了講指針而寫這樣一段程序,程序中傳遞的是 buf 的地址,把這個(gè)地址直接傳遞給函數(shù) ShiftLeft 的形參指針變量 p,也就是 p 指向了 buf。對比之前的函數(shù)調(diào)用,大家是否看明白,如果是普通變量傳遞,只能單向的,也就是說,主函數(shù)傳遞給子函數(shù)的值,子函數(shù)只能使用卻不能改變。而現(xiàn)在我們傳遞的是指針,不僅僅子函數(shù)可以使用 buf 里邊的值,而且還可以對 buf 里邊的值進(jìn)行修改。
此外再強(qiáng)調(diào)一句,只要是 p 前邊帶了變量類型如 unsigned char,就是表示定義了一個(gè)指針變量 p,而執(zhí)行代碼中的 p,是指 p 所指向的內(nèi)容。
通過理論的學(xué)習(xí)和這樣一個(gè)例程,我想大家對指針應(yīng)該有概念了,至于它的靈活應(yīng)用,需要我們在后邊的程序中慢慢去體會,理論上就不再過多贅述了。