c語(yǔ)言中的基本并不能滿(mǎn)足我們?nèi)粘J褂?這在其他面向?qū)ο蟮慕鉀Q方式是采用類(lèi)定義的方式解決,那么在c語(yǔ)言中,giant如何解決這個(gè)問(wèn)題,c語(yǔ)言中同樣提供有自定義類(lèi)型,太滿(mǎn)足用戶(hù)的需求,就是三類(lèi)自定義類(lèi)型:枚舉類(lèi)型,結(jié)構(gòu)體類(lèi)型,和共用體類(lèi)型.
- 枚舉類(lèi)型.
十分好理解,在c++中也繼承了這一點(diǎn),并且枚舉類(lèi)型也是經(jīng)常使用到的.
枚舉類(lèi)型主要的使用場(chǎng)景就是所有狀態(tài)都可以枚舉出來(lái)的場(chǎng)景.這個(gè)時(shí)候就可以通過(guò)枚舉類(lèi)型來(lái)定義這種類(lèi)型,比如一場(chǎng)球賽的狀態(tài):結(jié)束,正在進(jìn)行中,就可以使用枚舉類(lèi)型來(lái)自定義:
枚舉類(lèi)型使用enum關(guān)鍵字:
enum Gamestatus{PLAY,GAMEOVER}
int a;
Gamestatus game = PLAY;
a=game;
列舉了比賽的兩種狀態(tài).值得注意的是,枚舉類(lèi)型實(shí)際上是使用int來(lái)存儲(chǔ)的,所以可以使用enum類(lèi)型來(lái)初始化int變量,但是不能使用int值初始化enum類(lèi)型變量.
枚舉類(lèi)型十分適合使用在例如權(quán)限設(shè)置上,和switch多路分支結(jié)構(gòu)配合使用.
當(dāng)然枚舉類(lèi)型也有一些函數(shù),能夠?qū)崿F(xiàn)一些簡(jiǎn)單的功能.這里就不細(xì)說(shuō)了.
- 結(jié)構(gòu)體
現(xiàn)實(shí)生活中,很多類(lèi)型都有著復(fù)雜的屬性,比如一個(gè)人,用什么類(lèi)型來(lái)描述一個(gè)人呢.這在面向?qū)ο蟮木幊趟枷胫泻芎美斫?但在c語(yǔ)言中,是通過(guò)結(jié)構(gòu)體類(lèi)型,來(lái)自定義這種具有復(fù)雜結(jié)構(gòu)的類(lèi)型.
結(jié)構(gòu)體的定義使用關(guān)鍵字struct:
struct 結(jié)構(gòu)體名{
成員列表
}
//定義書(shū)這種類(lèi)型
struct Book
{
char name[20];
char author[10];
char publish[20];
double price;
};
成員列表由數(shù)據(jù)類(lèi)型和成員名構(gòu)成.
比較有趣的是,結(jié)構(gòu)體也可以嵌套使用:
struct data{
int year;
int month;
int day;
};
struct student{
int num;
char name[20];
char sex;
struct data birthday;
float score;
};
struct student{
int num;
char name[20];
char sex;
struct data{
int year;
int month;
int day;
}birthday;
float score;
};
聲明結(jié)構(gòu)體變量:
可以先定義,后聲明,也可以便定義邊聲明,主要還是使用的先定義后聲明的方式:
struct Book
{
char name[20];
char author[10];
char publish[20];
double price;
};
int main()
{
Book book1, book2;
結(jié)構(gòu)體成員的引用:
book1.name
void Structbook(){
Book book;
gets_s(book.name);
book.author="xiaoshe";
book.price = 34.6;
printf("%s,%s", book.name, book.author);
}
初始化:
void Structbook(){
Book book;
Book book2 = { "wagnhua","xiaoshe","chuban",6.345 };
gets_s(book.name);
book.author="xiaoshe";
book.price = 34.6;
printf("%s,%s\n", book.name, book.author);
printf("%s,%s,%f\n", book2.name, book2.author,book2.price);
}
- 結(jié)構(gòu)體數(shù)組
void Structbook(){
Book book;
Book book2 = { "wagnhua","xiaoshe","chuban",6.345 };
Book b[3]= { {"fg","sdfg","dfsg",34.5},{"fg","sdfg","dfsg",34.5},{"fg","sdfg","dfsg",34.5} };
b[1] = { "fg","sdfg","dfsg",34.5 };
- 結(jié)構(gòu)體指針(就相當(dāng)于普通的指針,只不過(guò)類(lèi)型是自定義的而已)
Book *book;
通過(guò)結(jié)構(gòu)體在指針訪(fǎng)問(wèn)結(jié)構(gòu)體變量:
*book.name ="sdf";
*book->name = "啥";
- 指向結(jié)構(gòu)體數(shù)組的指針相當(dāng)于指向與結(jié)構(gòu)體數(shù)組的首個(gè)結(jié)構(gòu)體的首地址
Book book[5],*b;
b=book;
// 相當(dāng)于
p=&book[0];
- 結(jié)構(gòu)體指針作為函數(shù)參數(shù)
使用指針可以實(shí)現(xiàn)數(shù)據(jù)值的雙向傳遞:
//排序函數(shù)
void sort(Student *stu,int n) {
Student t;
// 雙重for循環(huán)實(shí)現(xiàn)排序
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n - j;i++) {
if (stu[i].score<stu[i+1].score)
{
t = stu[i];
stu[i] = stu[i+1];
stu[i+1] = t;
}
}
}
}
void output(Student *stu,int n){
int i;
printf("student info are following:\n");
for (i = 0; i < n;i++,stu++) {
printf("%d\t%-20s\t%c\t%.2f%\t\n",stu->num,stu->name,stu->sex,stu->score);
}
}
int main()
{
// EnumSwith(WIN);
// Structbook();
Student*pstu, stu[4] = {
{1011,"we hua",'M',84},
{1011," huamei",'F',82},
{1011,"we hua",'M',80},
{1011,"we hua",'F',86},
};
pstu = stu;
sort(pstu, 4);
output(pstu, 4);
}
- 共用體,聯(lián)合體類(lèi)型
共用體和結(jié)構(gòu)體的使用是類(lèi)似的,只不過(guò)共用體的成員在分配內(nèi)存空間的時(shí)候,是共用同一片內(nèi)存空間的.