最近參加了幾個公司到學校的招聘會,筆試時大多要求使用c/c++語言,而且有些筆試考到了語言的細節部分。說來汗顏,c/c++只在大一學習時使用了一年,之後一直在學習高階語言的元件開發,到現在c/c++語言的有些細節,部分已經忘記。在此將c/c++的基礎要點重拾一遍,以便往後忘記之時查閱。
1、區域性變數儲存於堆疊上,堆疊是乙個動態可變的儲存區,所以區域性變數是在宣告它們的塊入口處建立,出口處銷毀。 2
、全域性變數儲存在乙個編譯器設定的固定儲存區中。他們在程式執行的整個時間內佔據空間。 3
、宣告與定義的區別:宣告說明變數的名稱及型別;定義會導致給變數分配記憶體。同一變數可以有許多宣告,但僅有乙個定義。 4
、大多數情況下,變數宣告也是定義。通過在extern限定符關鍵字可以宣告變數而沒有定義它,但要記住在程式的後面其他部分定義該變數。
fun1()
...int a;//定義全域性變數
注:如果將」int a;」
定義語句放在函式
fun1
前,則在
fun1
中就不必再宣告
a為全域性變數,因為編譯器已經知道
a為乙個
已經定義了的全域性變數
了。語句
「extern int a;」
只是宣告乙個變數而沒有定義它,如果在宣告時給該變數賦初值,即語句
」extern int a=1;」,
那麼該宣告就變成了乙個定義全域性變數語句。顯然,在
fun1
內不能使用該語句,否則編譯器會給出乙個「
不能對帶有塊範圍的外部變數進行初始化
」的錯誤提示。
5、靜態變數是永久變數,在兩次呼叫之間它們的值是不變的(其實這點全域性變數也滿足了!)。靜態變數分為靜態區域性變數和靜態全域性變數
兩種。使用
static
修飾變數時,編譯器像全域性變數一樣為之建立永久的儲存區,但區別是
靜態區域性變數只在其所在塊內可知,而靜態全域性變數則只在其所在檔案可知。這樣,static就使變數僅為需要它們的函式(部分)所知,一定程度上「隱藏」了靜態變數,使其相對與其他部分是「透明」的。
注:在c++應當使用命名空間從而更好的達到上述目的。
6、函式和全域性變數有外部鏈結,當指定extern時(大多數情況是不必指定的,因為函式預設就是
extern的,而在非塊內定義變數預設是extern變數
),他們對組成程式的所有檔案都是可用的;靜態全域性變數有內部鏈結,當指定static時,他們對所在檔案內是可知的;區域性變數沒有鏈結。
注:其實靜態全域性變數還可當作全域性變數,只是其可知範圍被縮小了,只在本檔案可知;靜態區域性變數也可當作區域性變數,只是其生命週期被延長了,不像區域性變數一樣在塊出口銷毀,而其可知範圍未變。
舉一例說明下靜態區域性變數的使用優點:
//返回增加後的引用計數,count在其他部分不可訪問
int addref()
//counter在本檔案其他部分可被訪問
static int counter=0;//靜態全域性變數,在本檔案內可知
int func1()
7
、暫存器變數(用register修飾)要求編譯器把乙個變數的值儲存在cpu暫存器而不是記憶體中,使對暫存器變數的操作比普通記憶體變數快。使用暫存器變數應注意以下幾點:只能用
register修飾區域性變數和形式引數;在c中不能通過&運算子取暫存器變數位址;在c++取暫存器變數位址可能阻止它被優化。
8、c和c++中都沒有指定表示式中子表示式
的求值順序,如果有以下語句:
x=f1()+f2();
而
f1()
和f2()
的執行結果又依賴於同乙個共享變數且會修改該變數,那麼應該根據邏輯人為指定他們的執行順序。 下接
c/c++要點全掌握(二)。
C C 要點全掌握(六) 變長引數
上接c c 要點全掌握 五 mutable volatile 設計乙個引數個數可變 引數型別不定的函式是可能的,最常見的例子是printf函式 scanf函式和高階語言的format函式。在c c 中,為了通知編譯器函式的引數個數和型別可變 即是不定的 未知的 就必須以三個點結束該函式的宣告。pri...
C C 基礎概念
1 類占用的記憶體大小 1 在不同位數的作業系統下,各種資料型別所占用的記憶體大小 32位和64位作業系統 2 計算類的記憶體大小的注意事項 1.類的大小為類的非靜態成員資料的型別大小之和,也就是說靜態成員資料不作考慮。2.普通成員函式與sizeof無關。3.虛函式由於要維護在虛函式表,所以要佔據乙...
tcp要點學習 基礎概念
tcp要點學習 基礎概念 author kevin lynx tcp是tcp ip協議簇中傳輸層上的一種網路協議,它是一種面向連線的 可靠的協議。為了提供這種可靠性,tcp實現了各種有效的機制 演算法。為了從一種巨集觀的角度去了解這個協議,這裡先大致地提一下與之相關 的概念。1.什麼是 面向連線的 ...