一、C語言概述
1.C語言的誕生
2.C語言的特點
3.嵌入式C的使用
二、C的數據類型
1.什麼是數據類型
2.各數據類型的字節長度和指針變量的字節長度
3.變量及變量的特點
4.右左法則及舉例
5.sizeof()和strlen()
一、C語言概述
1.C語言的誕生
C語言是在1978年由丹尼斯.裡奇與布萊恩·科爾尼干一起出版了名著《C程序設計語言》時發表誕生的。目前C的發展經歷了以下的過程
●在1972年,美國貝爾實驗室的 D.M.Ritchie 在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C語言。
●《可移植的C語言編譯程序》的發布,推廣了unix系統,於1978年,C語言正式發布,同時著名的書籍《The C Programming Language》發布。在之後,ANSI 在這本書的基礎上制定了C語言標准。
●於1990年, ISO接受了 C 為I SO C 的標准(ISO9899-1990)。並於1994年,修訂了C語言標准。5年之後, ISO對前版本做了修改,此次也修改了C語言的標准,增加了一些需要的功能。於 2001與2004,這兩年發生了 兩次技術修改。
●目前流行的C語言編譯系統大多是以ANSI C為基礎進行開發的,但不同版本的C編譯系統所實現的語言功能和語法規則又略有差別。
2.C語言的特點
.C語言運用廣泛,目前在許多編譯器中都可以實現:
●具有出色的可移植性,能夠在多種不同的體系結構的軟/硬件平台上運行。
●具有簡潔緊湊、使用靈活的語法機制,並能直接訪問硬件
●具有很高的運行效率
3.嵌入式C的使用
3.1嵌入式使用C語言開發的原因:在嵌入式操作系統的內核中主要由C語言實現,程序員進行開發時需要向內核中添加新的功能,且C能夠直接訪問硬件,移植性好,效率高的特點,所以使用C進行開發。雖然匯編語言的效率相比於C語言高,但是它不能直接實現一些比較復雜的功能如for循環等,通常匯編語言在對簡單硬件的初始化中進行使用。
二.C的數據類型
1.什麼是數據類型
數據類型就是數據集合的劃分,不同的數據類型對CPU具有不一樣的意義,所以一定要注意相應變量數據類型的定義和轉換。 數據類型又劃分為兩大類:基本數據類型和復合數據類型。
●復合數據類型包括 數組,結構,聯合,枚舉,指針
●基本數據類型包括 空類型,字符型,數值型
●而數值型又包括實型(單精度實型,雙精度實型),整型(短整型,整型,長整型)
2.各數據類型的字節長度和指針變量的字節長度
2.1.在不同的編譯系統中,編譯系統對各數據類型分配字節數可能不同,對此我們在編寫程序前必須對所用的編譯系統有相關的了解。例如在gcc編譯中各數據類型字節長度為:
int:4個字節;short:2個字節;long:4個字節:char:1個字節;float:4個字節
2.2指針的字節長度:通常指針的字節長度都是固定的,且長度有操作系統所決定。指針中存放的元素為地址,而不同的操作系統有其固定的地址長度,因而指針的字節長度也就固定。例如:
3.變量及變量的特點
3.1什麼是變量
在其值的作用域內可以改變的量稱為變量。一個變量應該有一個名字,在內存占據一定的存儲空間。
3.2變量的三大特點:
●變量的數據類型:主要說明變量占用內存空間的大小如int型。
●變量的作用域:變量的有效性的范圍。
●變量的存儲類型:變量在內存中的存儲方式。不同的存儲方式影響變量在內存的生存周期。
3.3變量的聲明和定義
定義:創建一個變量,為其分配內存空間,並為它取變量名,一個變量只能定義一次。
聲明:告知編譯器這個變量名已經匹配在一塊內存上了,但是並未為其分配內存。
3.4變量聲明和定義的兩種情況:
●定義性聲明:需要建立存儲空間。例如:int a在聲明時就已經建立了存儲空間。
●引用性聲明:不需要建立存儲空間。例如:extern int a其中變量a是在別的文件中定義的。
3.5變量的存儲區域的劃分
①棧空間:局部變量,函數形參,自動變量
②堆空間:malloc ralloc calloc分配空間
③數據段分為bbs,rodata,data。
●bss:保存未初始化的全局變量
●rodata:常量
●data(靜態數據區):全局變量,static修飾變量
④數據段代碼段 即數據區
棧空間特點:先進後出,管理權限:系統
堆空間特點:先進先出,管理權限:用戶
3.6
●全局變量與局部變量的區別
①存放位置
局部變量存放於棧空間,全局變量存放在 數據段的data(靜態數據區)區域
②賦值
當我們定義變量時,如果定義為全局變量,系統會自動把變量初始化為默認值(內置類型初始化為系統默認值,自定義類型調用相應的初始化函數進行初始化),而定義為局部變量時,系統不會自動初始化變量,我們必須手動對變量進行初始化(無論是內置類型還是自定義類型),否則得到的結果可能和我們預期的不一致,甚至導致程序出錯
③何時釋放
全局變量:在編譯時分配,在main結束時釋放;
局部變量、形參:在函數調用時分配,在函數返回時釋放
④作用域
●全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包括全局變量定義的源文件需要用extern關鍵字再次聲明這個全局變量。
●靜態局部變量具有局部作用域。它只被初始化一次,自從第一次初始化直到程序與你新內閣結束都一直存在,他和全局變量的區別在於全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。
●局部變量也只有局部作用域,他是自動對象,他在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用結束後,變量就被撤銷,其所占用的內存也被收回。
●靜態全局變量也具有全局作用域,他與全局變量的區別在於如果程序包含多個文件的話,他作用於定義它的文裡,不能作用到其他文件裡,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同的靜態全局變量,他們也是不同的變量。
4.右左法則及舉例
4.1.右左法則:從最內部的括號(變量)開始閱讀聲明,先向右看,再向左看,碰到一個括號時調轉閱讀方向,括號內的內容閱讀完畢則跳出括號。直到全部閱讀結束為止。例如:
(1)int a; a 整型變量
(2)int *a; p 整型指針變量
(3)int **a; p指針變量p,p指向另一指針,另一指針指向整型數
(4)int *a[10]; a是有十個元素的數組,裡面存放著指針變量,這些指針指向整型(整型指針數組)
(5)char (*a)(int); a是一個指針變量,它指向一個形參為int型,返回值為char型的函數(char型函數指針變量)
(6)int (*a[10])(int); a是一個指針數組,該指針指向一個形參為int型,返回值為int型的函數
(7)int *(* (*fp) (int))[10];fp是一個函數指針變量,該函數是一個形參為int型,返回值為數組指針的函數,該數組指針指 向整型指針
(8)void *(*c)(char ,int (*)());c是一個函數指針變量。該函數是一個形參為char,另一形參為形參為空返回值為int型的函 數指針變量且返回值為void的函數。
5.sizeof()和strlen()
5.1.sizeof():sizeof操作符以字節形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括號內的類型名。操作數的存儲大小由操作數的類型決定。切記sizeof()是一個運算符而不是一個函數。例如:
sizeof()在對變量的存儲大小進行計算時sizeof()可不加上括號,sizeof()在對數據類型的存儲大小進行計算時sizeof()不能省略括號。
5.2.strlen():從內存的某個位置(可以是字符串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字符串結束符'\0'為止,然後返回計數器值(長度不包含'\0'),實質上是一個C函數。