?
C語言是一種計(jì)算機(jī)程序設(shè)計(jì)語言。它既有高級語言的特點(diǎn),又具有匯編語言的特點(diǎn)。它可以作 為系統(tǒng)設(shè)計(jì)語言,編寫工作系統(tǒng)應(yīng)用程序,也可以作為應(yīng)用程序設(shè)計(jì)語言,編寫不依賴計(jì)算機(jī) 硬件的應(yīng)用程序。
事實(shí)上,C語言是一個(gè)很小的內(nèi)核語言,只包括極少的與硬件有關(guān)的部分,C語言不直接提供輸入輸出語句,有關(guān)文件都是要文件操作的語句和動(dòng)態(tài)內(nèi)存管理等操作都是要使用到系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)的,可以說C語言就是一種結(jié)構(gòu)化程序語言,這是一種分的思想, 以Hello World程序?yàn)槔?,可以建立兩個(gè)函數(shù),一個(gè)輸出Hello,一個(gè)輸出World。
?
2、C語言的數(shù)據(jù)類型列表:(后邊再詳解)
整型、浮點(diǎn)型(實(shí)數(shù)型)、單字符型、字符串型、數(shù)組類型、指針類型、結(jié)構(gòu)體類型、共用體類型
3、C語言的控制語句列表:(后邊再詳解)
跳轉(zhuǎn)型:goto語句、break語句、continue語句、return語句
判斷型:if-else語句
循環(huán)型:do-while語句、while語句、for語句
選擇語句:switch-case語句
4、最簡單的C程序:
?
#includeint a=3; //這是全局變量 a在整個(gè)程序中都可以起作用void f(int n); //里邊的n就是形式參數(shù) int main(void){ int n; //在這里定義一個(gè)n和形式參數(shù)的n互不影響 int b=50; //這是局部變量 b出了main函數(shù)它就沒有作用了 int a=2; // 在這里定義一個(gè)a和外邊那個(gè)a沒有聯(lián)系 if(a>b){ //這種就是復(fù)合語句 (包括其他循環(huán)、選擇語句) int a=1; // 在再這里定義一個(gè)a和外邊那些a沒有聯(lián)系 但是 //根據(jù)變量的特點(diǎn) 如果相同變量名稱的時(shí)候 //復(fù)合語句的變量會(huì)覆蓋外邊main函數(shù)的a,main函數(shù)的a會(huì)覆蓋外 // 邊全局變量的a //(小覆蓋大)}} void f(int n){ int n;//這里定義一個(gè)n也和形式參數(shù)的n沒有任何聯(lián)系}
?
1 )、一個(gè)程序由一個(gè)或者多個(gè)源程序文件組成,一個(gè)源程序中只有一個(gè)mai函數(shù)(主函數(shù))
2)、預(yù)處理指令:
1、 如#include
2、#include 的處理過程很簡單,就是將頭文件的內(nèi)容插入到該命令所在的位置,從而把頭文件和當(dāng)前源文件連接成一個(gè)源文件,這與復(fù)制粘貼的效果相同。
3、使用尖括號< >和雙引號" "的區(qū)別在于頭文件的搜索路徑不同:
使用尖括號< >,編譯器會(huì)到系統(tǒng)路徑下查找頭文件;
而使用雙引號" ",編譯器首先在當(dāng)前目錄下查找頭文件,如果沒有找到,再到系統(tǒng)路徑下查找。
5、全局變量和局部變量:
#include
1、局部變量? 只能在聲明的函數(shù)內(nèi)部使用,離開了聲明的函數(shù),就不能使用該變量了。不同的函數(shù)可以使用相同名字的變量,它們代表不同的對象,互不影響,形式參數(shù)也是局部變量,在一個(gè)函數(shù)的內(nèi)部也可以在復(fù)合語句中定義變量,這些變量中也只是在本復(fù)合語句中有效。復(fù)合語句稱為分程序,或程序塊。
2、全局變量不僅可以在main函數(shù)中,而且可以在別的函數(shù)中使用,也就是說全局變量是可以在程序中的任意地方使用。它可以增加函數(shù)之間數(shù)據(jù)的聯(lián)系,它在程序的全部執(zhí)行過程中都會(huì)占用存儲(chǔ)單元,是函數(shù)的通用性??偨Y(jié)來就是說兩者作用域不一樣
6、C函數(shù)的定義:
一個(gè)C程序是由一個(gè)或者多個(gè)函數(shù)組成的,但是其中必定要有且只有一個(gè)main函數(shù),程序開始也是從main函數(shù)開始的。
一個(gè)函數(shù)包含兩部分:1)函數(shù)首部,函數(shù)的第一行:函數(shù)類型、函數(shù)名,(函數(shù)參數(shù)類型,函數(shù)參數(shù)名稱),其是(形式參數(shù)),形式參數(shù)可以是void ,也可什么都沒有。2)函數(shù)體,表示函數(shù)花括號下的程序,一般都有:聲明部分,一般在使用一個(gè)變量之前,必須進(jìn)行對其聲明定義類型(數(shù)據(jù)類型),在每行數(shù)據(jù)聲明或者C語句后必須有一個(gè)分號表示結(jié)束。
7、說明:
C語言本身不提供輸入輸出語句,輸入輸出的操作都是要調(diào)用系統(tǒng)庫函數(shù)scanf和printf等函數(shù)來實(shí)現(xiàn)的,而此函數(shù)是在
而形參和實(shí)參:當(dāng)我們調(diào)用函數(shù)時(shí),對其傳入的參數(shù)和函數(shù)體內(nèi)接收到的參數(shù)其實(shí)并不是同一個(gè)變量。調(diào)用函數(shù)時(shí)向函數(shù)傳入的參數(shù)稱作實(shí)際參數(shù),簡稱實(shí)參,而函數(shù)體內(nèi)部用于接收外部調(diào)用時(shí)傳入的參數(shù)的參數(shù)稱為形式參數(shù),簡稱形參。
8、C程序運(yùn)行步驟:
編程—>編譯—>鏈接
1、編程:在編譯環(huán)境中書寫程序,編寫好了之后,系統(tǒng)會(huì)將此源程序,以.c為后綴的文件形式存放在指定的文件夾中,如 f.c文件
2、編譯:編譯環(huán)境會(huì)對源程序進(jìn)行語法檢查,如有發(fā)出錯(cuò)誤信息提醒編程人員修改,直到?jīng)]有語法錯(cuò)誤,編譯程序自動(dòng)將源程序轉(zhuǎn)換為二進(jìn)制形式的目標(biāo)文件? 是以后綴.obj文件保存。
3、 鏈接:經(jīng)過編譯所得到的二進(jìn)制目標(biāo)文件,還不能別計(jì)算機(jī)直接執(zhí)行,它們還只是零散的一個(gè)個(gè)部件,必須由鏈接程序?qū)⒕幾g后的目標(biāo)文件和函數(shù)庫還有其他生成的文件組成起來,生成一個(gè)計(jì)算機(jī)能執(zhí)行的可執(zhí)行文件。后綴名為.exe文件
9、C變量存儲(chǔ)方式與生存期:
1、在c語言中,變量的作用域 可以分為全局變量和局部變量,而從另一個(gè)角度說,變量的儲(chǔ)存有兩種不同的方式,靜態(tài)儲(chǔ)存方式和動(dòng)態(tài)儲(chǔ)存方式。靜態(tài)指的是程序運(yùn)行期間? 由系統(tǒng)分配固定的空間給程序,而動(dòng)態(tài)? 則是程序運(yùn)行期間 需要根據(jù)情況進(jìn)行動(dòng)態(tài)分配儲(chǔ)存空間的方式
2、內(nèi)存中使用儲(chǔ)存空間的情況,可以分為以下三種:
(1)程序區(qū)
(2)靜態(tài)儲(chǔ)存區(qū),存放全局變量 負(fù)責(zé)給程序運(yùn)行時(shí)分配內(nèi)存區(qū)? 在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00
(3)動(dòng)態(tài)儲(chǔ)存區(qū),它存放以下數(shù)據(jù):
1、函數(shù)形式參數(shù),在調(diào)用函數(shù)時(shí)給形參分配儲(chǔ)存空間
2、函數(shù)中的自動(dòng)變量
3、函數(shù)調(diào)用時(shí)的現(xiàn)場保護(hù)和返回地址等
4、對變量的儲(chǔ)存類型有四種,分別是:auto (自動(dòng)變量)、static (靜態(tài)變量)、register( 寄存器變量)、 extern(外部變量)
對以上這些數(shù)據(jù),在函數(shù)開始調(diào)用時(shí)分配動(dòng)態(tài)存儲(chǔ)空間,函數(shù)結(jié)束時(shí)釋放這些空間。在 c 語言中,每個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類別。
1- auto? (自動(dòng)變量)
在程序的函數(shù)中的局部變量,如果不專門聲明為靜態(tài)(static)存儲(chǔ)方式,都是自動(dòng)分配動(dòng)態(tài)的地址存儲(chǔ)空間。包括復(fù)合語句和函數(shù)的形參 都是的,自動(dòng)變量用關(guān)鍵字 auto 為聲明。重點(diǎn)是這些變量在函數(shù)調(diào)用完畢后它們都會(huì)被系統(tǒng)給釋放回收內(nèi)存
2- static 靜態(tài)變量(局部變量)
有時(shí)候,我們希望自己的局部變量不被函數(shù)調(diào)用完畢后消失,而繼續(xù)保持原值,其占用的儲(chǔ)存單元不是釋放,用關(guān)鍵字 static 進(jìn)行聲明 這類變量叫靜態(tài)變量。它和全局變量相同的是,在函數(shù)調(diào)用結(jié)束后,它并不釋放內(nèi)存,保留其當(dāng)前值,而且在整個(gè)程序運(yùn)行時(shí),都不釋放內(nèi)存。不同的是。它本質(zhì)還是局部變量,在其他函數(shù)中也不能使用它,而且,它只能進(jìn)行第一次賦值,在整個(gè)程序運(yùn)行時(shí),它只會(huì)保留上一次函數(shù)調(diào)用結(jié)束時(shí)的值。
一個(gè)被聲明為靜態(tài)的全局變量可以被模塊內(nèi)(源程序)所用函數(shù)訪問,但不能被其他模塊外(源程序)其他函數(shù)訪問,它是一個(gè)本地的全局變量
一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一源程序的其他函數(shù)調(diào)用.那就是,這個(gè)函數(shù)被限制在聲明它的模塊本地范圍內(nèi)使用
全局變量(外部變量)的說明再冠以static
就構(gòu)成了靜態(tài)的全局變量。當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯(cuò)誤。
把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍(只能在本地)
static函數(shù)與普通函數(shù)作用域不同,僅能在本源文件內(nèi)使用此函數(shù)。
3- register( 寄存器變量)
在程序運(yùn)行時(shí),如果一個(gè)變量,被頻繁使用,那么系統(tǒng)就必須多次訪問內(nèi)存中的單元,會(huì)影響程序執(zhí)行效率,因此為了提高效率,就產(chǎn)生了寄存器變量,它可以直接將局部變量的值存放到CPU的寄存器中,需要時(shí),直接從寄存器中取出參數(shù)運(yùn)算,不必經(jīng)過內(nèi)存中取存儲(chǔ),由于受硬件寄存器長度的限制,所以寄存器變量只能是char、int或指針型。寄存器說明符只能用于說明函數(shù)中的變量和函數(shù)中的形參,因此不允許將外部變量或靜態(tài)變量說明為"register"。由于寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,所以這樣可以提升執(zhí)行效率。
4- extern (外部變量)
一般來說外部變量是函數(shù)的外面定義的全局變量
如果沒有在頭文件中定義有外部變量(文件的知識(shí))
那如果在一個(gè)程序中如果需要在一個(gè)源文件內(nèi)擴(kuò)展到另一個(gè)源文件的作用域的全局變量,就可以在定義函數(shù)時(shí)引用extern關(guān)鍵字將該變量轉(zhuǎn)為“外部的變量”,表示將此變量的作用域擴(kuò)展到此位置,有了此聲明,就可以在其他源文件中使用此變量了。
將全局變量的作用域擴(kuò)展到其他文件,可以先在一個(gè)文件中定義一個(gè)變量,然后再在其他文件中用extern定義相同名字的變量,就可以將作用域擴(kuò)展到整個(gè)程序的結(jié)束了。
*注? 如果在文件1中的全局變量加了static那么這個(gè)變量就會(huì)被限制在此文件中了,在文件2中使用extern也訪問不到文件1的全局變量了
在一個(gè)函數(shù)聲明前加extern 此函數(shù)就會(huì)可擴(kuò)展作用域,可以在其他文件中使用此函數(shù)?! ?/p>
評論
查看更多