C語言回憶錄1--數(shù)據(jù)類型

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)合體類型和位域類型使用的不多,這里就不贅述了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容