初學C語言很難?帶你快速掌握關鍵字!
C語言關鍵字總結
- static關鍵字C語言
- const關鍵字C語言
- register關鍵字用法
- auto關鍵字
- inline內聯函數
1. static關鍵字
static可以用來修飾局部變量、全局變量、函數
局部變量
生命周期:原先存在棧中,生命周期語句執行完畢便結束了。現在存放到靜態數據區,生命周期持續到整個程序執行結束。
作用域:並沒有改變作用域,還是僅限於該語句塊。並且只在初次運行的時候進行初始化,下次調用時它的值是上一次函數調用結束之後的值。每次調用後值會被保存。
例如:
輸出結果:
全局變量
對於一個全部變量,既可以在本源文件中被訪問到,也可以在同一個工程的其它源文件中被訪問(只需用extern進行聲明即可)。
如果加上static,限制該全局變量的作用域範圍,由原來的整個工程可見變為本源文件可見。
函數
與修飾全局變量大同小異,就是改變了函數的作用域。
修飾函數時還有一處不同,就是調用靜態函數時,函數指針指向的地址始終是固定的,而普通函數每次返回的地址不一樣(這條特性是一個工作老手告訴大雄的,還沒來得及驗證)
extern用在變量或者函數的聲明前,用來說明“此變量/函數是在別處定義的,要在此處引用”。另外,用extern會加速程序的編譯過程,這樣能節省時間。
C++中static還有一些不同,這裏就暫時先不討論。
2. const關鍵字
C語言中保留的一個關鍵字,它用來限定一個變量是只讀的,即不可變的。
用const修飾一般變量
用const修飾的變量必須在聲明時進行初始化(用來修飾函數的形參除外)。
一旦一個變量被const修飾後,在程序中除初始化外對這個變量進行的賦值都是錯誤的。
const與指針搭配使用
兩個基礎概念:指針常量和常量指針
指針常量:即指針本身的值是不可改變的,而指針指向的變量的值是可以改變的;
常量指針:即指針指向的變量的值是不可改變的,而指針本身的值是可以改變的;
如果const在’*’左邊,則表示指針指向的變量的值不可變;
如果const在’*’右邊,則表示指針的值是不可變的;
註意:
不能顯式地通過賦值語句去改變a的值,但是不代表在程序中不能通過其它方法來修改這個值。
3. register關鍵字用法
register:這個關鍵字請求編譯器盡可能的將變量存在CPU 內部寄存器中而不是通過內存尋址訪問以提高效率。註意是盡可能,不是絕對。
寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內存快得多。
數據從內存裏拿出來先放到寄存器,然後CPU 再從寄存器裏讀取數據來處理,處理完後同樣把數據通過寄存器存放到內存裏,CPU 不直接和內存打交道。
有個故事,叫皇帝身邊的小太監,挺形象的:
大家都看過電視戲,那些老總們要閱讀文件的時候,管理層總是先將奏章交給皇帝旁邊的助理,助理呢再交給老總處理。這個小太監只是個中轉站,並無別的功能。
好,那我們再聯想到我們的CPU。CPU 不就是我們的老總麽?管理員就相當於我們的內存,數據從他這拿出來。那助理就是我們的寄存器了(這裏先不考慮CPU 的高速緩存區)。
數據從內存裏拿出來先放到寄存器,然後CPU 再從寄存器裏讀取數據來處理,處理完後同樣把數據通過寄存器存放到內存裏,CPU 不直接和內存打交道。
這裏要說明的一點是:小太監是主動的從大臣手裏接過奏章,然後主動的交給皇帝,但寄存器沒這麽自覺,它從不主動幹什麽事。一個皇帝可能有好些小太監,那麽一個CPU 也可以有很多寄存器,不同型號的CPU 擁有寄存器的數量不一樣。
為啥要這麽麻煩啊?速度!就是因為速度。寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內存快得多。
進水樓臺先得月嘛,它離CPU 很近,CPU 一伸手就拿到數據了,比在那麽大的一塊內存裏去尋找某個地址上的數據是不是快多了?那有人問既然它速度那麽快,那我們的內存硬盤都改成寄存器得了唄。我要說的是:你真有錢!
一些限制
(1)register變量必須是能被CPU所接受的類型。
這通常意味著register變量必須是一個單個的值,並且長度應該小於或者等於整型的長度。不過,有些機器的寄存器也能存放浮點數。
(2)因為register變量可能不存放在內存中,所以不能用“&”來獲取register變量的地址。
(3)只有局部自動變量和形式參數可以作為寄存器變量,其它(如全局變量)不行。 在調用一個函數時占用一些寄存器以存放寄存器變量的值,函數調用結束後釋放寄存器。此後,在調用另外一個函數時又可以利用這些寄存器來存放該函數的寄存器變量。
(4)局部靜態變量不能定義為寄存器變量。不能寫成:register static int a, b, c;
(5)由於寄存器的數量有限(不同的cpu寄存器數目不一),不能定義任意多個寄存器變量,而且某些寄存器只能接受特定類型的數據(如指針和浮點數),因此真正起作用的register修飾符的數目和類型都依賴於運行程序的機器,而任何多余的register修飾符都將被編譯程序所忽略。
註意:
早期的C編譯程序不會把變量保存在寄存器中,除非你命令它這樣做,這時register修飾符是C語言的一種很有價值的補充。
然而,隨著編譯程序設計技術的進步,在決定哪些變量應該被存到寄存器中時,現在的C編譯環境能比程序員做出更好的決定。
實際上,許多編譯程序都會忽略register修飾符,因為盡管它完全合法,但它僅僅是暗示而不是命令。
4. auto關鍵字
用於聲明變量的生存期為自動,所有的變量默認就是auto的。
5. inline內聯函數
調用函數時需要一定的時間和空間的開銷。C++提供一種提高效率的方法,即在編譯時將函數調用處用函數體替換,類似於C語言中的宏展開。這種在函數調用處直接嵌入函數體的函數稱為內聯函數(inline function),又稱內嵌函數或內置函數。
註意
是在函數定義時增加 inline 關鍵字,而不是在函數聲明時。
優點:
內聯函數可以有效避免函數調用的開銷,程序執行效率更高
缺點:
如果被聲明為內聯函數的函數體非常大,則編譯器編譯後程序的可執行碼將會變得很大。當內聯函數的函數體過大時,一般的編譯器會放棄內聯方式,而采用普通的方式調用函數。這樣,內聯函數就和普通函數執行效率一樣了。
總結
通常在程序設計過程中,我們會將一些頻繁被調用的短小函數聲明為內聯函數。
調用內聯函數和調用正規函數是等價的,差別僅僅是更快
今天的幹貨小夥伴們都掌握了嗎?編程語言的基礎一定要掌握牢固,才能在以後編程項目的時候運用如飛哦~
**加C/C++學習交流.群獲取C語言、C++、Windows高級編程,MFC框架編程、QT框架編程,大型企業實戰項目。Linux應用程序開發,Linux內核研究等多個知識點高級進階幹貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群...號是 546912356
**註:加群要求
1、零基礎,目前遇到困難不知從何下手可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、基礎非常紮實,但對目前主流技術欠缺,需要突破技術瓶頸的可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.企業一線C/C++高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!**
初學C語言很難?帶你快速掌握關鍵字!