您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)C語言中基本的數(shù)據(jù)類型有哪些,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
我們知道C語言中有基本數(shù)據(jù)類型:
int:基本整型,用于存儲(chǔ)整數(shù),占4個(gè)字節(jié),默認(rèn)值為0
short:短整型,占2個(gè)字節(jié)
long:長(zhǎng)整型,占4個(gè)字節(jié)
long long:雙長(zhǎng)整型,占8個(gè)字節(jié),比較少用
float:?jiǎn)尉雀↑c(diǎn)型,占4個(gè)字節(jié)
double:雙精度浮點(diǎn)型,占8個(gè)字節(jié)
char:字符型,用于存儲(chǔ)單字符,占1個(gè)字節(jié)。
(與Java等語言不同的是,c語言中沒有字符串類型,需要使用字符型數(shù)組來存放字符串)
// 定義字符型數(shù)組并賦值 char string[3]; string = ”abc”;
除了這些簡(jiǎn)單的、不可拆分的原子數(shù)據(jù)類型,還存在著復(fù)合數(shù)據(jù)類型(也叫構(gòu)造類型),如枚舉類型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型,這里我們要討論的就是其中的結(jié)構(gòu)體類型。
注:我認(rèn)為,數(shù)據(jù)類型其實(shí)包含了兩個(gè)概念,首先是將具有相同屬性的數(shù)據(jù)處理成一個(gè)集合,使屬性得以被限定、區(qū)分(如int a=“A”;是錯(cuò)誤的);其次是在這個(gè)集合上定義了一些操作,如int型的加減乘除運(yùn)算。
struct 結(jié)構(gòu)名 { 數(shù)據(jù)類型 變量名; 數(shù)據(jù)類型 變量名; ... } ;
struct關(guān)鍵字用來聲明結(jié)構(gòu)體,花括號(hào)內(nèi)的結(jié)構(gòu)體成員由我們?nèi)我獍l(fā)揮(若存在相同的數(shù)據(jù)類型,也可以簡(jiǎn)寫:int a,b,c;)。
這里的結(jié)構(gòu)名叫做結(jié)構(gòu)體的標(biāo)識(shí)符,類似于int a中的int,但僅僅是類似,請(qǐng)看下面:
//定義一個(gè)名為student的結(jié)構(gòu)體 struct student{ char name[8]; int age; char sex[2]; };
現(xiàn)在我們只是按照自己的需求,完成了對(duì)結(jié)構(gòu)體student的定義,然而這僅僅是個(gè)模版,編譯后并沒有為其分配空間,下面讓我們?nèi)ナ褂眠@個(gè)新的數(shù)據(jù)類型:
student stu;//報(bào)錯(cuò)
在上面提到student這個(gè)標(biāo)識(shí)符只是類似于基本數(shù)據(jù)類型的類型名稱,因?yàn)橐胪耆诟拍钌系葍r(jià),我們需要在前面加上struct關(guān)鍵字,即struct student是一個(gè)整體,不可以省去struct:
struct student stu; //成功編譯
現(xiàn)在,我們已經(jīng)成功定義了一個(gè)變量stu,系統(tǒng)為其分配了該數(shù)據(jù)類型(結(jié)構(gòu)體)所需要的儲(chǔ)存空間。
以上兩部分還可以簡(jiǎn)寫在一起:
struct student{ char name[8]; int age; char sex[2]; }stu;//將stu寫在尾綴,構(gòu)造結(jié)構(gòu)體的同時(shí)完成了對(duì)結(jié)構(gòu)體變量的定義,如需多個(gè)結(jié)構(gòu)體變量,可以使用逗號(hào)分隔開
struct student{ char name[8]; int age; char sex[2]; }stu1,stu2,stu3;//同時(shí)定義多個(gè)結(jié)構(gòu)體變量,如果需要定義多個(gè)具有相同模式的結(jié)構(gòu)體變量時(shí)用這種方法比較方便
到這里,你有沒有想過能不能省略結(jié)構(gòu)體名稱呢?可以。此時(shí)定義的結(jié)構(gòu)體稱為匿名結(jié)構(gòu)體(也叫無名結(jié)構(gòu)體):
struct{ char name[8]; int age; char sex[2]; }stu1,stu2,stu3;//省略掉標(biāo)識(shí)符后,依然能完成變量的定義,但此時(shí)要注意,我們已經(jīng)無法通過在結(jié)構(gòu)體外定義新的該結(jié)構(gòu)體的變量了,所以匿名結(jié)構(gòu)體僅僅在確定不會(huì)再定義其他結(jié)構(gòu)體變量的時(shí)候使用
typedef關(guān)鍵字,作用是給一種數(shù)據(jù)類型定義一個(gè)新名字。這里的數(shù)據(jù)類型包括內(nèi)部數(shù)據(jù)類型(int,char等基本數(shù)據(jù)類型)和自定義的數(shù)據(jù)類型(struct等)。使用typedef起別名有兩個(gè)好處,一是給變量一個(gè)易記、含義明確的新名字,二是簡(jiǎn)化一些比較復(fù)雜的類型聲明(如struct student中的struct)。
typedef struct student{ char name[8]; int age; char sex[2]; }xuesheng; xuesheng stu;//省略struct,使用別名完成變量stu的創(chuàng)建
現(xiàn)在,仔細(xì)閱讀的你不難發(fā)現(xiàn):此時(shí)尾綴xuesheng的地位已經(jīng)不可與同日而語了,時(shí)過境遷,它不再是我們偷懶定義出來的變量,而是結(jié)構(gòu)體student的別名了,此時(shí)struct student與xuesheng等價(jià)。
typedef struct{ char name[8]; int age; char sex[2]; }xuesheng;//這里的student依然可以去掉!即使去掉,我們也可以在以后去使用它的別名xuesheng
一個(gè)變量的初始化其實(shí)包含兩個(gè)內(nèi)容,一是創(chuàng)建變量,二是為變量賦值以使用?,F(xiàn)在讓我們賦值吧。
a.逐個(gè)賦值:
stu.name = "Jack";//錯(cuò)誤,不能直接給數(shù)組名賦值,因?yàn)閿?shù)組名是一個(gè)常量 strcpy(stu.name, "Chenhao");//不能直接給數(shù)組名賦值,因?yàn)閿?shù)組名是一個(gè)常量。 stu.num = 21; strcpy(stu.sex, "男");
b.整體賦值:
stu = (struct Student){"Chenhao", 21, "男"};//此時(shí)需要強(qiáng)制類型轉(zhuǎn)換,因?yàn)閿?shù)組賦值也是使用{},不轉(zhuǎn)換的話系統(tǒng)無法區(qū)分! stu = (xuesheng){"Chenhao", 21, "男"};//別忘了也可以用等價(jià)的別名喲~
struct student{ char name[8]; int age; char sex[2]; }stu = {"Chenhao", 21, "男"};//此時(shí)很直觀是在為結(jié)構(gòu)體變量賦值,因此不需要強(qiáng)制類型轉(zhuǎn)換
struct student{ char name[8]; int age; char sex[2]; }stu = {"Chenhao", 21, "男"}; struct student stu1 = stu;//不是通過指針指向來賦值,確確實(shí)實(shí)是復(fù)制了一份相同的stu成員變量給放到了新變量stu1的存儲(chǔ)空間里,也就是stu1如實(shí)地開辟了自己的空間
以上賦值的方式需要注意初始化值的類型和順序要與結(jié)構(gòu)體聲明時(shí)成員對(duì)應(yīng)的類型和順序保持一致!另外,部分初始化的方式請(qǐng)移步自行查閱。
與結(jié)構(gòu)體數(shù)組的成員訪問相同,一樣放在結(jié)構(gòu)體數(shù)組中講。
結(jié)構(gòu)體類型也與基本數(shù)據(jù)類型一樣,可以作為數(shù)組的元素的類型。
結(jié)構(gòu)數(shù)組定義格式:
struct 結(jié)構(gòu)名 { 成員列表 } 數(shù)組名[數(shù)組長(zhǎng)度];
如:
struct student{ char name[8]; int age; char sex[2]; }stu[145];//定義一個(gè)結(jié)構(gòu)結(jié)構(gòu)數(shù)組stu,共有145個(gè)元素,即145個(gè)學(xué)生的學(xué)生信息
結(jié)構(gòu)體數(shù)組的賦值
//整體賦值: stu = (struct Student){{"Zhangsan", 18, "男"},{"Lisi", 15, "女"},......}; stu[0] = (struct Student){"Chenhao", 21,"男"}; //結(jié)構(gòu)體變量成員逐個(gè)賦值: strcpy(stu[144].name, "Smith"); stu[144].age = 10; stu[144].sex = "女";
//逐個(gè)輸出結(jié)構(gòu)數(shù)組的元素 int length = sizeof(stu) / sizeof(struct student);//結(jié)構(gòu)體數(shù)組的長(zhǎng)度,結(jié)構(gòu)體數(shù)組變量大小/單個(gè)模版大小 for (int i = 0; i<length; i++) { printf("姓名:%s 年齡:%d 性別:%s \n", stu[i].name, stu[i].age, stu[i].sex); }
結(jié)構(gòu)體數(shù)組小歸納:
名稱 | 含義 |
---|---|
stu | student結(jié)構(gòu)體數(shù)組 |
stu[2] | student結(jié)構(gòu)的一個(gè)變量,為第三個(gè)同學(xué) |
stu[2].name | char型數(shù)組,第三個(gè)同學(xué)的名字?jǐn)?shù)組 |
stu[2].name[0] | 第三個(gè)同學(xué)的名字的首字母 |
//直接 struct student{ char name[8]; int age; char sex[2]; }*pstu;
//后續(xù)間接 typedef struct student{ char name[8]; int age; char sex[2]; }stu; stu *pstu;//定義了一個(gè)指針變量,它只能指向Student結(jié)構(gòu)體類型的結(jié)構(gòu)體變量
如果想把已經(jīng)定義的結(jié)構(gòu)體變量交給一個(gè)指針,則必須用取址符&:
struct student{ char name[8]; int age; char sex[2]; }stu; pstu =stu//錯(cuò)誤 pstu =&stu//正確
(這里要說明的是,結(jié)構(gòu)體變量名稱單獨(dú)拿出來代表變量全體成員值的集合,這與數(shù)組不同,數(shù)組名稱在使用時(shí)直接轉(zhuǎn)化為該數(shù)組的起始地址)
(*結(jié)構(gòu)指針變量). 成員名
或
結(jié)構(gòu)指針變量 -> 成員名(我們管“->”叫做“箭頭”)
(*pstu).name; //或 pstu->name;
注意(* pstu).name的小括號(hào)不能省略,成員符“.”優(yōu)先級(jí)最大,取值符“ *”優(yōu)先級(jí)在其次,去掉括號(hào)就相當(dāng)于 *(pstu.name)了。
格式千千萬,只有全掌握才能閱讀別人的代碼,但在實(shí)際開發(fā)中最推薦的格式依然是:
typedef struct student{ char name[8]; int age; char sex[2]; }xuesheng;
也不要忘了在整體賦值且在結(jié)構(gòu)體外賦值時(shí)的強(qiáng)制轉(zhuǎn)換。
如果有所收獲,點(diǎn)個(gè)贊唄~
最后:
#include<stdio.h> int main(){ printf("aiweiye forever."); }
以上就是C語言中基本的數(shù)據(jù)類型有哪些,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。