1、c語言在編譯之前,會先對一些預處理指令作解釋,產生新的源程式,這個過程稱為編譯預處理。
2、預處理指令以#開頭,並且結尾沒有分號。
3、將預處理指令寫在源程式開頭,它的作用範圍是預處理指令之後的整個源程式檔案。
4、c語言提供的預處理指令主要有:巨集定義、檔案包含、條件編譯。
5、巨集定義分為不帶引數的巨集定義和帶引數的巨集定義。
6、不帶引數的巨集定義的一般形式:#define 巨集名 字串,巨集名一般大寫,字串可省略。
7、巨集定義的作用是在預編譯處理時,將源程式中的所有巨集名替換成字串,不會作語法檢查。
8、巨集定義不會對字串內的字元作替換操作。
9、定義乙個巨集時可引用已經定義的巨集名。
10、如需終止巨集定義的作用域,可以用#undef命令。
11、帶引數的巨集定義的一般形式:#define 巨集名(引數列表) 字串。
12、帶引數的巨集定義作用是在預編譯處理時,將源程式中的所有巨集名替換成字串的同時將字串中的引數用巨集名右邊引數列表中的引數替換。
13、巨集名和引數列表之間不能有空格,否則空格後面的所有字串都作為替換的字串。
14、建議將巨集定義的引數和計算結果放入小括號。
15、巨集定義不涉及儲存空間的分配、引數型別匹配、引數傳遞、返回值等。
16、帶引數的巨集比函式具有更高的執行效率。
1、條件編譯:程式的其中一部分**只有在滿足一定條件時才進行編譯,否則不參與編譯。
2、條件編譯示例。
//如果條件成立,就將code1編譯進去
#if max == 0
...code1...
//如果條件成立,就將code2編譯進去
#elif max > 0
...code2...
//如果條件都不成立,將code3編譯進去
#else
...code3...
#endif
//如果max這個巨集已定義,就將code3編譯進去.
#if defined(max)
...code3...
#endif
//如果max這個巨集已定義,就將code4編譯進去.
#ifdef max
...code4...
#endif
//如果max這個巨集沒定義,就將code5編譯進去.
#if !defined(max)
...code5...
#endif
//如果max這個巨集已定義,就將code6編譯進去.
#ifndef max
...code6...
#endif
1、#include指令可以將乙個檔案的全部內容拷貝到當前檔案中。
2、#include 《檔名》:直接到c語言庫函式標頭檔案所在的目錄中查詢檔案。
3、#include 「檔名」:系統會先在源程式當前目錄下查詢,再到path路徑中查詢,最後到c語言庫函式標頭檔案所在的目錄中查詢。
4、#include指令允許巢狀包含,不允許遞迴包含。
5、避免重複包含的標頭檔案示例。
//解決重複包含同乙個標頭檔案
#ifndef _one_h_
#define _one_h_
void one();
#endif
1、c語言根據變數作用域的不同,將變數分為區域性變數和全域性變數。
2、在函式內部定義的變數,稱為區域性變數,作用域:定義它的函式內部。
3、在所有函式外部定義的變數,稱為全域性變數,作用域:從定義變數之後的整個原始檔。
4、c語言根據變數的儲存型別不同,將變數分為:自動變數、靜態變數、暫存器變數。
5、被關鍵字auto修飾的區域性變數是自動變數,儲存在堆疊中,區域性變數預設是自動變數。
6、自動變數生命週期:程式執行到宣告自動變數的**塊時,自動變數才被建立,當自動變數所在的**塊執行完畢後,自動變數就會自行銷毀。
7、被關鍵字static修飾的區域性變數是全域性變數,儲存在靜態記憶體中,全域性變數預設是靜態變數。
8、靜態變數生命週期:在程式執行前建立,在程式整個執行期間始終存在,直到程式結束。
9、被關鍵字register修飾的自動變數是暫存器變數,只有自動變數才能是暫存器變數,並且只限於int、char和指標型別變數。
10、暫存器變數儲存在硬體暫存器中,由於數目限制,不能使用太多暫存器變數,將頻繁使用的自動變數定義為暫存器變數可以大大提高運算速度。
1、外部函式:如果當前檔案中定義的函式允許其他檔案訪問、呼叫,就稱為外部函式,外部函式不允許同名。
2、內部函式:如果在當前檔案中定義的函式不允許其他檔案訪問、呼叫,只能在內部使用,就稱為內部函式。不同的原始檔中內部函式可以同名。
3、在定義函式時,如果在函式的最左邊加上關鍵字extern,則表示函式是外部函式,定義函式預設是外部函式。
4、在乙個檔案中要呼叫其他檔案的外部函式,則需要在當前檔案中用extern宣告該外部函式,extern也可以省略。
1、在定義函式時,在函式的最左邊加上static可以把函式定義為內部函式。
2、關鍵字static也可以用來宣告乙個內部函式。
1、關鍵字extern可以用來宣告乙個全域性變數,但不能用來定義變數。
2、乙個全域性變數可以供多個源檔案共享,多個原始檔中同名的全域性變數都代表著同乙個變數。
1、static全域性變數只初始化一次,防止在其他檔案單元中被引用。
1、陣列內部的每乙個元素必須是相同型別的,結構體內部的元素可以是不同型別的。
2、struct關鍵字是結構體型別的標誌,結構體內部的元素稱為成員。
3、結構體變數的定義方式:先定義結構體型別再定義變數、定義結構體型別的同時定義變數、省略型別名直接定義結構體型別變數。
4、結構體不允許本身遞迴定義,但可以包含別的結構體。
5、定義結構體型別時並不分配記憶體空間,只有在定義屬於結構體型別的變數時,系統才會分配儲存空間給變數。
6、結構體變數占用的記憶體空間是其成員所佔記憶體空間之和,而且各成員在記憶體中按定義的順序依次排列。
7、結構體的初始化:將各成員的初值按順序放在一對大括號中,並用逗號分隔,一一對應賦值,結構體只能在定義變數的同時進行初始化賦值。
8、引用結構體變數成員一般形式為:結構體變數名.成員名,點稱為成員運算子,優先順序是最高的。
9、如果某個成員也是結構體變數,可以連續使用成員運算子訪問下一級的成員。
10、相同型別的結構體變數之間可以進行整體賦值。
11、結構體陣列跟普通陣列的用法相同,只不過每個元素都是乙個結構體。
12、結構體變數作為函式引數進行傳遞時,其實傳遞的是全部成員的值,形參的改變不會影響到實參。
13、結構體指標變數的定義形式:struct 結構體名稱 *指標變數名。
1、列舉是一種基本資料型別,當乙個變數有幾個固定的可能取值時,可以將這個變數定義為列舉型別。
2、列舉型別的定義:enum 列舉名 。
3、列舉變數的定義:先定義列舉型別再定義列舉變數、定義列舉型別的同時定義列舉變數、省略列舉名稱直接定義列舉變數。
4、c語言編譯器會將列舉元素作為整型常量處理,稱為列舉常量。
5、列舉的值取決於定義時各列舉元素排列的先後順序,沒有指定值的元素,其值為前乙個元素加1,預設第乙個列舉的值為0。
6、可以給列舉變數賦值列舉常量或整型值。
1、typedef關鍵字可以為各種資料型別定義乙個別名,也可以在別名的基礎上再起乙個別名。
2、typedef可以給指標、結構體和列舉型別起別名,當然也可以給指向結構體的指標和函式的指標起別名。
3、typedef是給資料型別定義乙個別名,#define只是替換**中的巨集名,他們是有很大區別的。
一 黑馬程式設計師 C語言總結
asp.net unity開發 net培訓 期待與您交流!自動型別轉換 整數除以整數還是整數 3.0 2 1.5000 double e 3 2 e 1.0000 自增自減 int a 10 b a a b 22 b 10 12 int a 10 b a a b 22 b 11 11 10 10 1...
黑馬程式設計師 C語言學習總結筆記9月17號
ios培訓 安卓培訓 期待與您交流!書寫 1main函式應該寫在所有函式最後面。2所有c語言檔案都需要引入乙個標頭檔案,有 include或者 include stdafx.h 讓一些呼叫的c語言自帶的函式得以執行。3命名函式名的時候應該盡可能有意義,避免a,b,c這種命名,並且使用駝峰命名法。in...
黑馬程式設計師 C語言學習筆記之陣列(九)
ios期待與您交流!1 定義 格式 型別 陣列名 元素個數 裡面的個數必須是乙個固定值,可以是常量 比如6 8 常量表示式 比如3 4 5 7 絕對不能使用變數或者變數表示式來表示元素個數,大多數情況下不要省略元素個數2 初始化 一般形式是 型別 陣列名 元素個數 int a 2 其實相當於 int...