變量的定義爲變量分配地址和存儲空間,變量的聲明不分配地址。一個變量能夠在多個地方聲明,可是隻在一個地方定義。同時加入extern修飾的變量的聲明,說明此變量將在文件之外或在文件後面部分定義。
說明-不少時候一個變量,只是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間,如外部變量。編程
int main() { extern int A; //這是個聲明而不是定義,聲明A是一個已經定義了的外部變量 //注意:聲明外部變量時能夠把變量類型去掉如:extern A; dosth(); //執行函數 } int A; //是定義,定義了A爲整型的外部變量
在程序中能夠利用#ifdef、#endif將某一個模塊的代碼特殊定義,以向特定用戶提供該功能。在不須要用戶能夠將其屏蔽。數組
#ifdef MATH #include "math.c" #endif
同時在window下應對硬件編譯的時候,能夠利用這種編譯繞過硬件,直接進行編譯得出預期的結果。
注意-雖然不用條件編譯命令而直接用if語句也能達到要求,但那樣作目標程序長,運行時間長,進行條件編譯時,能夠減小被編譯的語句,從而減小目標程序的長度,減小運行時間。多線程
//int與零值比較 if ( n == 0 ) if ( n != 0 ) //bool與零值比較 if (flag) // 表示flag爲真 if (!flag) // 表示flag爲假 //float與零值比較 const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) //其中EPSINON是容許的偏差(即精度)。 //指針變量與零值比較 if (p == NULL) if (p != NULL)
聲明時能夠直接初始化,同一結構體的不一樣對象之間也能夠直接賦值,可是當結構體中含有指針"成員"時必定要當心。
注意-當有多個指針指向同一段內存時,某個指針釋放這段內存可能會致使其餘指針的非法操做。所以在釋放前必定要確保其餘指針再也不使用這段內存空間ide
sizeof是一個操做符,strlen是庫函數
sizeof的參數能夠是數據的類型,也能夠是變量。而strlen只能以結尾'\0'的字符串作參數
編譯器在編譯時就計算出了sizeof的結果,而strlen函數必須在運行時才能計算出來,而且sizeof計算的數據類型佔內存的大小,而strlen計算的是字符串實際的長度
數組作sizeof的參數不退化,傳遞給strlen就退化爲指針了函數
在c中,static關鍵字用來修飾局部靜態變量和外部靜態變量、函數。在C++中除了上述功能外,還用來定義類的成員變量和函數。即靜態成員和靜態成員函數
注意-在編程時static的記憶性,和全局性的特色可讓在不一樣時期調用的函數進行通訊,傳遞信息,而C++的靜態成員則能夠在多個對象實例間進行通訊,傳遞信息線程
new、delete是操做符,能夠進行重載,只能在C++中使用
malloc、free是函數,能夠覆蓋,c與C++中均可以使用
new能夠調用對象的構造函數,相應delete調用的是析構函數
malloc僅僅分配內存,free僅僅回收內存,並不執行構造與析構函數
new、delete返回的是某種數據類型指針,malloc、free返回的是void指針
注意-malloc申請的內存空間要用free釋放,而new申請的內存空間要用delete釋放,不要混用指針
# d e f i n e m i n ( a , b ) ( ( a ) < = ( b ) ? ( a ) : ( b ) )
++i自增1再返回
i++先返回1,再自增1code
狀態寄存器一類的並行設備硬件寄存器
一箇中斷服務子程序會訪問到的非自動變量
多線程間被幾個任務共享的變量
注意-雖然volatile在嵌入式方面應用比較多,可是在PC端軟件的多線程中,volatile修飾的臨界變量也是很是實用的對象