星期六, 1月 09, 2010

pointer with const


const int x; // constant int
x = 2; // illegal - can't modify x

const int* pX; // changeable pointer to constant int
*pX = 3; // illegal - can't use pX to modify an int
pX = &someOtherIntVar; // legal - pX can point somewhere else

int* const pY; // constant pointer to changeable int
*pY = 4; // legal - can use pY to modify an int
pY = &someOtherIntVar; // illegal - can't make pY point anywhere else

const int* const pZ; // const pointer to const int
*pZ = 5; // illegal - can't use pZ to modify an int

pZ = &someOtherIntVar; // illegal - can't make pZ point anywhere else

Const Correctness in C++



const int * p1;

int const * p2;

int * const p3;

p1,p2,p3究竟差別在哪裡呢?這個地方課本也不太講,網路上也有一些奇怪的解釋,我的不一定對,只是一個看法而已。

解決這個問題前,先知道一下C語言的命名邏輯,如果我沒有記錯,C語言是【前面的】形容【後面的】,【後面的優先被compiler處理】,例如:

int var;

上述的意思就是:【有一塊記憶體叫var,它的型態是int】,這個基本邏輯知道後,就可以解答前面的問題了。

另外當一顆星星(pointer)出現的時候,還沒有特別告訴compiler型態,此時就會以預設值替代,一般來說【預設值是ram】,注意有些cpu比較複雜,就不會只有ram這樣單純,可能是internal sram、external 16bit ram或是external sdram這些比較複雜的可能性發生。

假設此時用一個16bit address的cpu,有RAM,有FLASH,假設int是指16bit變數,const是指FLASH的空間,注意這不是絕對。



const int * p1;

有一塊記憶體叫p1。....(1)

(1)這【整個東西】是pointer,p1預設放在RAM...(2)

(2)這【整個東西】是int...(3)

(3)這【整個東西】是const

注意【整個東西】,例如(3)式,它的所謂整個東西,是包含(2)(1)的,其餘類推。



int const * p2;

有一塊記憶體叫p2。....(1)

(1)這【整個東西】是pointer,p2預設放在RAM...(2)

(2)這【整個東西】是const...(3)

(3)這【整個東西】是int



int * const p3;

有一塊記憶體叫p3。....(1)

(1)這【整個東西】是const,p3放在flash...(2)

(2)這【整個東西】是pointer...(3)

(3)這【整個東西】是int



以一個沒有特別設定的compiler來說

p1會放在【RAM】內,它指到某個【16bit】的地方,那個地方在【FLASH】。

p2會放在【RAM】內,它指到【FLASH】內的某個地方,那個地方是【16bit】。

p3會放在【FLASH】內,它指到的某個【16bit】的地方,那個地方是【RAM】。

給個結論,p1與p2的功能會一樣。

p3比較特別,放在FLASH內,指到RAM,究竟這樣有什麼用呢?例如有一個動態字串要顯示,很明顯的,內容要放在RAM,程式固定在某個地方抓資料,所以位址存在FLASH內即可,可以省點RAM的空間,或許有人認為才2個bytes有什麼好省的,但是如果是顯示多國語言字型,有好多的pointer要存,就有差別了。



所以看一下另一個宣告:

const int * const p4;

知道是什麼意思了吧!p4會放在FLASH內,它指到的某個16bit的地方,那個地方是flash。

【int const * const p5】,所以p5功能同p4。

怎麼用呢?以上面那個多國語言字型為例,一般來說,字型資料是點矩陣資料,必定是放在FLASH內,所以要寫出一個embedded程式可以自由控制變數該放哪裡,要會做這些雜事,不要過度依賴compiler預設動作,那是不可靠的,甚至是兩顆星星以上的pointer都要會,連void*也要會。

可以想想看,如果字型資料是放在NAND FLASH,HDD,甚至是SD CARD中,那該怎麼辦呢?

全文轉錄自

冬季的黎明 - C語言裡,究竟const加pointer該如何用呢?

沒有留言:

張貼留言