程序是由算法和數據組成的,可見數據是很重要的一個基礎知識。
本節 總結兩個東西,一個是C語言的數據類型,另一個是各數據類型在內存中所占字節數。
一.數據類型
基本數據類型:字符型:char ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?整型: ? (1)short int 短整型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)int 整型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)long int 長整型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?浮點型: (1)float 單精度型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)double 雙精度型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)long double 長雙精度型
構造類型 : Array 數組
? ? ? ? ? ? ? ? ? ? ? ?enum ?枚舉
? ? ? ? ? ? ? ? ? ? ? ?struct ?結構體
? ? ? ? ? ? ? ? ? ? ? ?union ?共用體
指針類型
void類型
二 、數據類型在內存中的所占字節數
對于C語言各數據類型在內存中所占用的字節數,有很多籠統的說法,難免看得人云里霧里。各數據類型的字節數與三方面因素有關,
(1)CPU位寬
(2)操作系統位寬
(3)編譯器類型和版本
其實,最簡單的方法是,使用sizeof()函數測試一下。下面給出我編譯環境、測試代碼和測試結果:
環境: xcode 8.3.2
? ? ? ? ? ? ? 操作系統:macOS 10.12.5
? ? ? ? ? ? 處理器:Intel Core i7 (64位四核心CPU)
代碼和測試結果
C語言中數據類型的本質含義,是表示一個內存格子的長度和解析方法。
數據類型決定長度的含義,如一個內存地址(0x30000000),本來只代表一個字節的長度,但是實際上我們可以通過給它一個類型(int),讓它有了長度(4),這樣這個代表內存地址的數字0x30000000,就能表示從這個數字開頭的連續n(4)個字節的內存格子了,即0x30000000 + 0x30000001 + 0x30000002 + 0x30000003。
數據類型決定解析方法的含義是:假如有一個內存地址(0x30000000),我們可以通過給這個內存地址不同的類型來指定這個內存單元格子中二進制數的解析方法。如int的含義就是0x30000000 + 0x30000001 + 0x30000002 + 0x30000003這四個字節連起來共同存儲的是一個int型數據;那float的含義就是0x30000000 + 0x30000001 + 0x30000002 + 0x30000003這四個字節連起來共同存儲的是一個float型數據。
int a;時,編譯器會自動分配一塊內存出來,假設這里是32位操作系統,那么int就是4個字節,如果這塊內存的第一個字節(首字節)地址為0x12345678,編譯器會將變量名a與這個首字節地址綁定,對a進行存取與操作,實際上就是向0x12345678開始的4個字節空間進行讀寫操作。
float a;
(int *)a;? ? ? ? // 等價于分配一塊指針類型的空間,并且把地址和變量名關聯
最后我們談談C語言中的函數,不知道你是否思考過C語言中函數調用是如何實現的,主調函數是如何找到那些被調函數的。在C語言中,函數就是一段代碼的封裝。函數名的實質就是這一段代碼的首地址,所以說函數名的本質也是一個內存地址。有了函數名(指針),也就是有了地址,我們才實現了函數的調用。
? ? ? ? ? ? ? ? ? ? ??