資源描述:
《C語言中const的用法.doc》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、C語言中const的用法?const是一個C語言的關鍵字,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一些幫助。???我們來分情況看語法上它該如何被使用。???1、函數(shù)體內(nèi)修飾局部變量。???例:???voidfunc()???{?????constinta=0;???}???首先,我們先把const這個單詞忽略不看,那么a是一個int類型的局部自動變量,我們給它賦予初始值0。然后再看const.???
2、const作為一個類型限定詞,和int有相同的地位。???constinta;???intconsta;???是等價的。于是此處我們一定要清晰的明白,const修飾的對象是誰,是a,和int沒有關系。const要求他所修飾的對象為常量,不可被改變,不可被賦值,不可作為左值(l-value)。???這樣的寫法也是錯誤的。???constinta;???a=0;???這是一個很常見的使用方式:????constdoublepi=3.14;???在程序的后面如果企圖對pi再次賦值或者修改就會出錯。???然后看一個稍微復雜的例
3、子。???constint*p;???還是先去掉const修飾符號。???注意,下面兩個是等價的。???int*p;???int*p;???其實我們想要說的是,*p是int類型。那么顯然,p就是指向int的指針。???同理???constint*p;???其實等價于???constint(*p);???intconst(*p);???即,*p是常量。也就是說,p指向的數(shù)據(jù)是常量。???于是???p+=8;//合法???*p=3;//非法,p指向的數(shù)據(jù)是常量。???那么如何聲明一個自身是常量指針呢?方法是讓const盡可
4、能的靠近p;???int*constp;???const右面只有p,顯然,它修飾的是p,說明p不可被更改。然后把const去掉,可以看出p是一個指向int形式變量的指針。???于是???p+=8;//非法???*p=3;//合法???再看一個更復雜的例子,它是上面二者的綜合???constint*constp;???說明p自己是常量,且p指向的變量也是常量。???于是???p+=8;//非法???*p=3;//非法???const還有一個作用就是用于修飾常量靜態(tài)字符串。???例如:???constchar*name="
5、David";???如果沒有const,我們可能會在后面有意無意的寫name[4]='x'這樣的語句,這樣會導致對只讀內(nèi)存區(qū)域的賦值,然后程序會立刻異常終止。有了const,這個錯誤就能在程序被編譯的時候就立即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發(fā)現(xiàn)。???const還可以用來修飾數(shù)組???constchars[]="David";???與上面有類似的作用。???2、在函數(shù)聲明時修飾參數(shù)???來看實際中的一個例子。???NAME???memmove--copybytestring???LIBRARY?
6、??StandardCLibrary(libc,-lc)???SYNOPSIS???#include???void*???memmove(void*dst,constvoid*src,size_tlen);???這是標準庫中的一個函數(shù),用于按字節(jié)方式復制字符串(內(nèi)存)。它的第一個參數(shù),是將字符串復制到哪里去(dest),是目的地,這段內(nèi)存區(qū)域必須是可寫。它的第二個參數(shù),是要將什么樣的字符串復制出去,我們對這段內(nèi)存區(qū)域只做讀取,不寫。于是,我們站在這個函數(shù)自己的角度來看,src這個指針,它所指向的內(nèi)存
7、內(nèi)所存儲的數(shù)據(jù)在整個函數(shù)執(zhí)行的過程中是不變。于是src所指向的內(nèi)容是常量。于是就需要用const修飾。例如,我們這里這樣使用它。???constchar*s="hello";???charbuf[100];???memmove(buf,s,6);//這里其實應該用strcpy或memcpy更好???如果我們反過來寫,???memmove(s,buf,6);???那么編譯器一定會報錯。事實是我們經(jīng)常會把各種函數(shù)的參數(shù)順序?qū)懛?。事實是編譯器在此時幫了我們大忙。如果編譯器靜悄悄的不報錯,(在函數(shù)聲明處去掉const即可),那
8、么這個程序在運行的時候一定會崩潰。???這里還要說明的一點是在函數(shù)參數(shù)聲明中const一般用來聲明指針而不是變量本身。???例如,上面的size_tlen,在函數(shù)實現(xiàn)的時候可以完全不用更改len的值,那么是否應該把len也聲明為常量呢?可以,可以這么做。我們來分析這么做有什么優(yōu)劣。???如果加了const,那么對于這個函數(shù)的實現(xiàn)者