在單片機程序設計中,我們經常會用到const這個關鍵字,在有些單片機的編譯器中可能會是code(比如51系列單片機),但我們在學習C語言的時候,首先還是先學到的const。我們知道,const關鍵字的含義是"常量的,常數的,不變的"意思。我們最初學到的是cont int a = 5;或者const unsigned char array[5] = {0,1,2,3,4};我們把a、array[n]稱之為常值變量。我們在單片機編程中可能不會經常用到const int a = 5這種語句。但我們會經常用到const unsigned int array[5]這種方式。因為我們都知道,我們要把大數組定義到const所指向的存儲空間中,在單片機里我姑且把這片空間稱為ROM空間。既然是ROM空間,那肯定就是只讀空間了,因為單片機的RAM空間少得可憐。我們知道,C語言最偉大的地方,就是設計了指針,指針可以指向任何地方。在初學指針的時候,老師就教我們int *p;p是一個指向int類型的指針變量,如果我們定義了int a = 8; 如果p = &a;那么我把*p = 10;變量a的值也跟着變成10。原因我們都知道,因為P指向了a,p里存放的是a的地址,而*號的意思是取值(內容),*p變了,a當然會變了。在對const 、指針有了初步的了解后,我們就可以理解const int *p了,當然也有寫成int const *p的,其實都是一樣的。怎么理解呢?我這里也是跟別人學到的,說是,要看const修飾的誰,比如前面的const int a,const修飾的是 a,所以a是一個常值變量,只會在程序初始化時賦值一次,以后不管怎么搞都不會變化的。對於const int *p,const 修飾的是 *p,我們知道,P是指向int類型的指針變量,*p是指向的變量的內容(值),加上const修飾后,是不是可以理解*p是一個常值呢,所以說,是指向常值變量,換句話說是一個指向ROM空間的指針變量。我們在定義const int *p;這種變量的時候,就是為了指向ROM空間,指向一個存常值的空間。這里有些用詞可能不太專業,准確。但這里需要注意,對於ROM空間,不是說只能通過定義const int*p;去訪問。這里只是向讀者說明,const int *p;是一個指向ROM空間的指針變量
理解了const int *p;我們再來理解一下,int * const p,還是根據前面的模式去理解,const 修飾的是p,而p是一個指針,所以,int * const p,定義的p是一個指針常量,這個指什是固定的,只在初始化的時候賦給它一次,以后就不能亂指了。不像const int*p,P是可變的。
這里通過兩個實例來說一下,兩者的區別:
1 int a = 10; 2 const int *p = &a; 3 *p = 12; //這段程序的編譯是錯誤的,會提示: attempt to modify object qualified const 4 5 6 int a = 10; 7 int b = 20; 8 const int *p; 9 p = &a; 10 *p //*p輸出的是10 11 p = &b; 12 *p //*p輸出的是20 13 14 int a; 15 int b; 16 int *const p = &a; 17 p = &b; //這里會編譯出錯