感謝您關(guān)注莫日根電氣電子工作室微信,!如果您尚未關(guān)注,請(qǐng)點(diǎn)擊標(biāo)題下方的“莫日根電氣電子工作室”關(guān)注我們 看了這么幾天的關(guān)鍵字,,突然間意識(shí)到32個(gè)關(guān)鍵字看似不多,,但要學(xué)習(xí)掌握的卻是很多,。這幾天同事問(wèn)我為什么學(xué)習(xí)《C語(yǔ)言深度剖析》還要自己再這樣的敲寫(xiě)一遍?我想這樣可以更好的過(guò)一遍大腦吧,!也還因?yàn)檫@樣做感覺(jué)像是大家一起在學(xué),,畢竟現(xiàn)在人們是在時(shí)間碎片化學(xué)習(xí),這樣也算是分享吧,! 說(shuō)說(shuō)今天的第一個(gè)關(guān)鍵字吧,! return關(guān)鍵字 return 用來(lái)終止一個(gè)函數(shù)并返回其后面跟著的值。 return (Va l),;// 此括號(hào)可以省略,。但一般不省略,尤其在返回一個(gè)表達(dá)式的值時(shí),。 return 可以返回些什么東西呢,?看下面例子: char * Func(void) { char str[30]; … return str; } str 屬于局部變量,位于棧內(nèi)存中,,在Func結(jié)束的時(shí)候被釋放,,所以返回str將導(dǎo)致錯(cuò)誤。 【return 語(yǔ)句不可返回指向“棧內(nèi)存”的“指針”,,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時(shí)被自動(dòng)銷毀】 const關(guān)鍵字 const 關(guān)鍵字也許該被替換為 readolny const是constant 的縮寫(xiě),,是恒定不變的意思,也翻譯為常量,、常數(shù)等,。很不幸,正是因?yàn)檫@一點(diǎn),,很多人都認(rèn)為被 const修飾的值是常量,。這是不精確的,精確的說(shuō)應(yīng)該是只讀的變量,,其值在編譯時(shí)不能被使用,因?yàn)榫幾g器在編譯時(shí)不知道其存儲(chǔ)的內(nèi)容,?;蛟S當(dāng)初這個(gè)關(guān)鍵字應(yīng)該被替換為readonly 。那么這個(gè)關(guān)鍵字有什么用處和意義呢,? const 推出的初始目的,,正是為了取代預(yù)編譯指令,消除它的缺點(diǎn),,同時(shí)繼承它的優(yōu)點(diǎn),。我們看看它與define 宏的區(qū)別。(很多人誤以為define 是關(guān)鍵字,,在這里我提醒你再回到本章前面看看32個(gè)關(guān)鍵字里是否有define),。 const 修飾的只讀變量 定義const只讀變量,,具有不可變性。 例如: const int Max=100; int Array[Max]; 這里請(qǐng)?jiān)赩isualC++6.0 里分別創(chuàng)建.c 文件和.cpp 文件測(cè)試一下,。你會(huì)發(fā)現(xiàn)在.c 文件中,,編譯器會(huì)提示出錯(cuò),而在.cpp 文件中則順利運(yùn)行,。為什么呢,?我們知道定義一個(gè)數(shù)組必須指定其元素的個(gè)數(shù)。這也從側(cè)面證實(shí)在 C 語(yǔ)言中,,const修飾的Max 仍然是變量,,只不過(guò)是只讀屬性罷了;而在C++ 里,,擴(kuò)展了const的含義,,這里就不討論了。 注意:const修飾的只讀變量必須在定義的同時(shí)初始化,,想想為什么,? 留一個(gè)問(wèn)題:case 語(yǔ)句后面是否可以是const修飾的只讀變量呢?請(qǐng)動(dòng)手測(cè)試一下,。 節(jié)省空間,,避免不必要的內(nèi)存分配,同時(shí)提高效率 編譯器通常不為普通const只讀變量分配存儲(chǔ)空間,,而是將它們保存在符號(hào)表中,,這使得它成為一個(gè)編譯期間的值,沒(méi)有了存儲(chǔ)與讀內(nèi)存的操作,,使得它的效率也很高,。 例如: #define M 3 //宏常量 const int N=5; // 此時(shí)并未將N 放入內(nèi)存中 ...... int i=N; // 此時(shí)為N 分配內(nèi)存,以后不再分配,! int I=M; // 預(yù)編譯期間進(jìn)行宏替換,,分配內(nèi)存 int j=N; // 沒(méi)有內(nèi)存分配 int J=M; // 再進(jìn)行宏替換,又一次分配內(nèi)存,! const定義的只讀變量從匯編的角度來(lái)看,,只是給出了對(duì)應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),,所以,,const定義的只讀變量在程序運(yùn)行過(guò)程中只有一份拷貝(因?yàn)樗侨值闹蛔x變量,存放在靜態(tài)區(qū)),,而#define定義的宏常量在內(nèi)存中有若干個(gè)拷貝,。#define宏是在預(yù)編譯階段進(jìn)行替換,而const修飾的只讀變量是在編譯的時(shí)候確定其值。#define宏沒(méi)有類型,,而const修飾的只讀變量具有特定的類型,。 修飾一般變量 一般常量是指簡(jiǎn)單類型的只讀變量。這種只讀變量在定義時(shí),,修飾符 const可以用在類型說(shuō)明符前,,也可以用在類型說(shuō)明符后。例如: int const i=2; 或 const inti=2; 修飾數(shù)組 定義或說(shuō)明一個(gè)只讀數(shù)組可采用如下格式: int const a[5]={1, 2, 3, 4, 5};或 const int a[5]={1, 2, 3, 4, 5}; 修飾指針 const int *p; // p可變,,p 指向的對(duì)象不可變 int const *p; // p 可變,,p 指向的對(duì)象不可變 int*constp; //p 不可變,p 指向的對(duì)象可變 const int*const p; // 指針p 和p 指向的對(duì)象都不可變 在平時(shí)的授課中發(fā)現(xiàn)學(xué)生很難記住這幾種情況,。這里給出一個(gè)記憶和理解的方法: 先忽略類型名(編譯器解析的時(shí)候也是忽略類型名),,我們看 const離哪個(gè)近?!敖畼桥_(tái)先得月”,,離誰(shuí)近就修飾誰(shuí)。 const int *p; //const 修飾*p,p 是指針,,*p是指針指向的對(duì)象,,不可變int const * p;//const修飾*p,p 是指針,*p是指針指向的對(duì)象,,不可變 int*const p;//const修飾p,,p 不可變,p 指向的對(duì)象可變 const int *constp; // 前一個(gè)const修飾*p,后一個(gè)const修飾p ,,指針p 和p 指向的對(duì)象都不可變,。 修飾函數(shù)的參數(shù)(感覺(jué)這個(gè)以后可以試試) const修飾符也可以修飾函數(shù)的參數(shù),當(dāng)不希望這個(gè)參數(shù)值被函數(shù)體內(nèi)意外改變時(shí)使用,。例如: void Fun(const int i); 告訴編譯器i 在函數(shù)體中的不能改變,,從而防止了使用者的一些無(wú)意的或錯(cuò)誤的修改。 修飾函數(shù)的返回值 const修飾符也可以修飾函數(shù)的返回值,,返回值不可被改變,。例如: const int Fun (void); 在另一連接文件中引用const只讀變量: extern const int i; // 正確的聲明 extern const int j=10; //錯(cuò)誤!只讀變量的值不能改變,。 注意這里是聲明不是定義,,關(guān)于聲明和定義的區(qū)別,請(qǐng)看本章開(kāi)始處,。 講了這么多講完了嗎?遠(yuǎn)沒(méi)有,。在 C++ 里,,對(duì) const做了進(jìn)一步的擴(kuò)展,還有很多知識(shí)未能講完,。有興趣的話,,不妨查找相關(guān)資料研究研究,。 |
|
來(lái)自: 走出塵埃 > 《工控之路——C 學(xué)習(xí)》