1、數(shù)據(jù)類型
a.概念:什么是數(shù)據(jù)類型?
簡單點兒來說,數(shù)據(jù)類型就是計算機對現(xiàn)實中數(shù)據(jù)的一種抽象和表示,比如現(xiàn)實中的數(shù)字,字母,文字,圖形等等,由于每種數(shù)據(jù)所含的內(nèi)容不同,所需要的內(nèi)存空間也不同,為了能夠用適當(dāng)?shù)膬?nèi)存大小去表示數(shù)據(jù),因此才有了整型,浮點型等數(shù)據(jù)類型,這些類型本質(zhì)上只是所分配的內(nèi)存空間大小不同。為了能夠表示現(xiàn)實中一些復(fù)雜的關(guān)系,又出現(xiàn)了構(gòu)造類型等來表示,更復(fù)雜的一些可以參考數(shù)據(jù)結(jié)構(gòu)這方面的資料。
b.分類:數(shù)據(jù)類型的分類
- 基本數(shù)據(jù)類型
- 字符型 char
- 短整型 short
- 整 型 int
- 長整型 long
- 超長整型 long long
- 單精度浮點型 float
- 雙精度浮點型 double
- 長雙精度浮點 long double
- 構(gòu)造類型
- 數(shù)組類型 int array[9];
- 結(jié)構(gòu)體類型 struct abc { };
- 枚舉類型 enum abc{};
- 聯(lián)合體類型 union abc{};
- 位域型 int a:3;
- 指針類型分類
- 數(shù)據(jù)指針 int * p=&a;
- 函數(shù)指針 int (*f) (void );
- void類型分類
- void 指針類型 void * p;
- void 函數(shù)類型
- void 參數(shù)類型
c.基本數(shù)據(jù)類型
| 類型 | 字節(jié) | 范圍 |
|---|---|---|
| (signed) char | 1 | -128~127 |
| unsigned char | 1 | 0~255 |
| short | 2 | -32768~32767 |
| unsigned short | 2 | 0~65535 |
| (signed) int | 4 | -2147483648~2147483647 |
| unsigned int | 4 | 0~4294967295 |
| long int | 8 | -9223372036854775808~923372036854775807 |
| unsigned long int | 8 | 0~18446744073709551615 |
| long long int | 8 | 同 long int |
| unsigned long long int | 8 | 同 long int |
| float 有效數(shù)字(6,7) | 4 | -3.410^-38~3.410^38 |
| double 有效數(shù)字(15,16) | 8 | -1.710^-308~1.7*10^308 |
| long double 有效數(shù)字(18,19) | 16 | -1.210^-4932~1.210^4932 |
注:由于不同平臺的數(shù)據(jù)類型占用大小不一樣,具體占用字節(jié)可以使用sizeof(T)得出
對于這些不同的類型,在使用的時候要注意所需要表示的數(shù)據(jù)大小,來選擇合適的數(shù)據(jù)類型,避免內(nèi)存的浪費。
浮點型也被稱為實型,就是小數(shù)的表示類型,由于計算機中內(nèi)存有限,并且整型的運算速度比較快,因此將數(shù)據(jù)分為整型和實型來表示。
舉個栗子,對于班級學(xué)號的表示,一般只需要unsigned char 類型就可以表示了,只需要一個字節(jié),如果使用int,則需要4個字節(jié),造成了內(nèi)存的浪費。下面是一些實例:
eg:
int intValue=4;
char charValue='a';
long int longValue=2323223;
long long longlongValue=22222121212;
所定義的變量要注意使用范圍,不要溢出
//這是個測試系統(tǒng)基本類型占用字節(jié)的代碼
#include <stdio.h>
void main()
{
printf("char is %d\n",sizeof(char));
printf("short is %d\n",sizeof(short));
printf("int is %d\n",sizeof(int));
printf("long int is %d\n",sizeof(long int));
printf("long long int is %d\n",sizeof(long long int ));
printf("float is %d\n",sizeof(float));
printf("double is %d\n",sizeof(double));
printf("long double is %d\n",sizeof(long double));
printf("Hello,Data Type!\n");
}
d.構(gòu)造類型
構(gòu)造類型是由基本數(shù)據(jù)類型組合所得到的,主要由數(shù)組,結(jié)構(gòu)體,聯(lián)合體,枚舉類型等組成,其中比較常用的是數(shù)組以及結(jié)構(gòu)體類型
d.1數(shù)組
數(shù)組就是若干個相同類型的的數(shù)據(jù)的集合,其作用是簡化了我們定義的繁瑣程度,假如一個班里有50位學(xué)生,為了表示他們的成績,我們需要定義50個變量來表示他們,需要寫一大串程序,如果使用數(shù)組就比較方便了,數(shù)組的本質(zhì)上是在內(nèi)存空間里開辟連續(xù)的若干個相同的某種基本數(shù)據(jù)類型大小的內(nèi)存空間,程序的本質(zhì)最終都會反映在內(nèi)存的改變,不僅要知道程序的表象,更要深入其本質(zhì)去理解內(nèi)存的變化。
-
定義: 基本類型 數(shù)組名[num1][num2][....];
eg: int a[10]; float f[4]; double dou[5]; 分類:嚴格來說,數(shù)組并沒有所謂的分類,一般根據(jù)我們的需要來定義不同維度的數(shù)組,常用的多為一維和二維數(shù)組。
int one[10] ; //這是一維
int two[10][2]; //二維
int three[10][2][3]; //三維 一般用到三維就不錯了引用方式: 數(shù)組定義后就可以使用了,引用和定義方式差不多,定義的時候[]內(nèi)的數(shù)字代表數(shù)組的大小,引用的時候代表數(shù)組中某個元素的索引,我們習(xí)慣上使用下標這個詞來稱呼它。值得注意的是,數(shù)組引用的時候序號最大為數(shù)組大小-1,從0開始引用。
//定義了一個10個int元素的數(shù)組
int array[10];
//引用
array[0];//這里引用了array數(shù)組中的第一個元素
array[9];//這里引用了array數(shù)組中最后一個元素數(shù)組和指針的關(guān)系: 其實指針和數(shù)組的訪問是可以相互轉(zhuǎn)化的,他們之間的關(guān)系比較復(fù)雜,這里就不多加贅述了,如果有需要的可以去查閱相關(guān)資料。
d.2結(jié)構(gòu)體
結(jié)構(gòu)體是用來表示復(fù)雜關(guān)系的一種可以自定義的數(shù)據(jù)類型,和面向?qū)ο笾械念愊嗨?,一般情況下只將數(shù)據(jù)放在結(jié)構(gòu)體中,而類class則將函數(shù)(方法)一起放在類中。
-
定義結(jié)構(gòu)體: 結(jié)構(gòu)體的定義比較靈活,以struct關(guān)鍵字開始,接著是結(jié)構(gòu)體類型名和大括號,結(jié)構(gòu)體類型名也是可以省去的,這時候需要直接定義結(jié)構(gòu)體變量。
struct 結(jié)構(gòu)體類型名 { //成員表列 }; //注意末尾的分號不能少 eg: struct student { char name[20]; int age; int height; char sex; float score; }; 定義結(jié)構(gòu)體變量:定義結(jié)構(gòu)體指的是定義一種新結(jié)構(gòu)體類型,比如student結(jié)構(gòu)體類型,定義結(jié)構(gòu)體變量是指用這個新的結(jié)構(gòu)體類型來定義一個變量。
struct student a,b; //此處定義了兩個student 類型的變量a,b
struct student * P; //定義了一個結(jié)構(gòu)體指針變量結(jié)構(gòu)體成員變量的引用:結(jié)構(gòu)體變量的引用有兩種方式,一種是結(jié)構(gòu)體變量名+小數(shù)點+結(jié)構(gòu)體成員變量名,另一種是結(jié)構(gòu)體指針變量+->+結(jié)構(gòu)體成員變量名。
struct student a,*p;
a.name="ciqujingnian";
a.age=23;
p->height=170;
p->sex='m';
d.3枚舉類型
枚舉類型采用關(guān)鍵字enum來定義,主要是定義一些字符串來代表一些數(shù)字代碼,枚舉類型的成員變量實質(zhì)與int類型沒有什么區(qū)別,使用枚舉類型的作用主要是增加程序的可讀性。
- 定義:enum +枚舉類型名+ {成員}變量名列表
eg:
enum day
{
MON,
TUE,
WED,
THU,
FRI,
SAT,
SUN
};
enum day today;//定義一個day類型的變量today
枚舉類型中成員的值默認是從0開始以1遞增的,也可以指定某一個成員的值,此成員之后的值將會以這個成員的值開始以1遞增
- 引用:定義了某個枚舉類型的變量之后便可以使用此變量了,不過此變量賦值時只接受枚舉類型的成員值。
enum day today;
today=MON;
today=SAT;
其實,任意的int類型的數(shù)字都可以賦值給枚舉類型的變量,但是要添加enum 類型名強制轉(zhuǎn)換,轉(zhuǎn)換后這個枚舉變量的值已經(jīng)不是枚舉類型中枚舉成員的值了,也就失去了枚舉變量的作用和意義。
d.4聯(lián)合體類型和位域類型
聯(lián)合體類型和位域類型使用的不多,這里就不贅述了。