1. 程式人生 > >12.3 C語言指標的簡單示例

12.3 C語言指標的簡單示例

前邊我們提到了,指標的意義往往在小程式裡是體現不出來的,對於簡單程式來說,有時候用了指標,反而可能比沒用指標還麻煩,但是為了讓大家鞏固一下指標的用法,我還是寫了個使用指標的流水燈程式,目的是讓大家從簡單程式開始瞭解指標,當程式複雜的時候不至於手足無措。
  1. #include <reg52.h>
  2. sbitADDR0 = P1^0;
  3. sbitADDR1 = P1^1;
  4. sbitADDR2 = P1^2;
  5. sbitADDR3 = P1^3;
  6. sbitENLED = P1^4;
  7. void ShiftLeft(unsigned char *p);
  8. void main(){
  9. unsigned int i;
  10. unsigned char buf = 0x01;
  11. ENLED = 0; //使能選擇獨立 LED
  12. ADDR3 = 1;
  13. ADDR2 = 1;
  14. ADDR1 = 1;
  15. ADDR0 = 0;
  16. while (1){
  17. P0 = ~buf; //緩衝值取反送到 P0 口
  18. for (i=0; i<20000; i++); //延時
  19. ShiftLeft(&buf); //緩衝值左移一位
  20. if (buf == 0){ //如移位後為 0 則重賦初值
  21. buf = 0x01;
  22. }
  23. }
  24. }
  25. /* 將指標變數 p 指向的位元組左移一位 */
  26. void ShiftLeft(unsigned char *p){
  27. *p = *p << 1; //利用指標變數可以向函式外輸出運算結果
  28. }
這是一個使用指標實現流水燈的例子,純粹是為了講指標而寫這樣一段程式,程式中傳遞的是 buf 的地址,把這個地址直接傳遞給函式 ShiftLeft 的形參指標變數 p,也就是 p 指向了 buf。對比之前的函式呼叫,大家是否看明白,如果是普通變數傳遞,只能單向的,也就是說,主函式傳遞給子函式的值,子函式只能使用卻不能改變。而現在我們傳遞的是指標,不僅僅子函式可以使用 buf 裡邊的值,而且還可以對 buf 裡邊的值進行修改。

此外再強調一句,只要是*p 前邊帶了變數型別如 unsigned char,就是表示定義了一個指標變數 p,而執行程式碼中的*p,是指 p 所指向的內容。


通過理論的學習和這樣一個例程,我想大家對指標應該有概念了,至於它的靈活應用,需要我們在後邊的程式中慢慢去體會,理論上就不再過多贅述了。