【C语言笔记结构体】
我們都知道C語(yǔ)言中變量的類(lèi)型決定了變量存儲(chǔ)占用的空間。當(dāng)我們要使用一個(gè)變量保存年齡時(shí)可以將其聲明為int類(lèi)型,當(dāng)我們要使用一個(gè)變量保存某一科目的考試成績(jī)時(shí)可以將其聲明為float。
那么,當(dāng)我們要做一個(gè)學(xué)生信息管理系統(tǒng)時(shí),需要保存學(xué)生的姓名、學(xué)號(hào)、年齡等信息,該怎么做呢?
如當(dāng)要保存三個(gè)學(xué)生的信息時(shí),
方法一是:
char *name1,*name2,*name3; // 三個(gè)學(xué)生的姓名 int num1,num2,num3; // 三個(gè)學(xué)生的學(xué)號(hào) int age1,age2,age3; // 三個(gè)學(xué)生的年齡方法二是:
// 創(chuàng)建結(jié)構(gòu)體模板 struct student {char *name; // 學(xué)生名字int num; // 學(xué)生學(xué)號(hào)int age; // 學(xué)生年齡 };// 使用該結(jié)構(gòu)體模板創(chuàng)建三個(gè)變量stu1, stu2, stu3 struct student stu1, stu2, stu3;顯然,方法二跟更清晰,因?yàn)樗裯ame、num、age都集成在一個(gè)模板,要用的時(shí)候只要套用模板進(jìn)行創(chuàng)建即可。這就是結(jié)構(gòu)體。
什么是結(jié)構(gòu)體
結(jié)構(gòu)體(struct)是由一系列具有相同類(lèi)型或不同類(lèi)型的數(shù)據(jù)項(xiàng)構(gòu)成的數(shù)據(jù)集合,這些數(shù)據(jù)項(xiàng)稱(chēng)為結(jié)構(gòu)體的成員。如上面的student結(jié)構(gòu)體包含三個(gè)成員,分別是name、num、age。
結(jié)構(gòu)體是C語(yǔ)言中的一種構(gòu)造類(lèi)型。C語(yǔ)言的數(shù)據(jù)類(lèi)型如下圖:
?
結(jié)構(gòu)體變量的定義方法
方法一:
// 創(chuàng)建結(jié)構(gòu)體模板struct student struct student{char *name; // 學(xué)生名字int num; // 學(xué)生學(xué)號(hào)int age; // 學(xué)生年齡 };// 使用該結(jié)構(gòu)體模板創(chuàng)建三個(gè)變量stu1, stu2, stu3 struct student stu1, stu2, stu3;此處,student是結(jié)構(gòu)體名,該名字是由任意定義的,但是盡量起個(gè)有意義的名稱(chēng)。其相當(dāng)于一個(gè)模板,可以使用這個(gè)模板去定義變量stu1,stu2,stu3。定義的時(shí)候不要忘了struct。
方法二:
// 定義三個(gè)結(jié)構(gòu)體變量stu1, stu2, stu3 struct{char *name; // 學(xué)生名字int num; // 學(xué)生學(xué)號(hào)int age; // 學(xué)生年齡 }stu1, stu2, stu3;相對(duì)于方法一,此處省略了結(jié)構(gòu)體名。雖然更簡(jiǎn)潔了,但是因?yàn)闆](méi)有了名字,后面就不能用該結(jié)構(gòu)定義新的變量。
方法三:
// 給結(jié)構(gòu)體模板struct student重新命名為student typedef struct student{char *name; // 學(xué)生名字int num; // 學(xué)生學(xué)號(hào)int age; // 學(xué)生年齡 }student;// 使用student創(chuàng)建三個(gè)結(jié)構(gòu)體變量stu1, stu2, stu3 student stu1, stu2, stu3;此處使用typedef為結(jié)構(gòu)體模板struct student定義一個(gè)別名student,關(guān)于typedef的介紹移步至#define與typedef的區(qū)別?進(jìn)行查看。使用typedef給結(jié)構(gòu)體創(chuàng)建一個(gè)別名,這在實(shí)際編程用使用非常廣泛,如STM32單片機(jī)固件庫(kù)中,使用得很多,如下圖:
初始化結(jié)構(gòu)
初始化變量和數(shù)組如下:
int count = 0; int arr[7] = {0,1,2,3,4,5,6};結(jié)構(gòu)體變量是否也可以這樣初始化?是的,可以。與初始化數(shù)組的語(yǔ)法類(lèi)似:
struct student stu1 = {"ZhengNianJun", // 名字:正念君520, // 學(xué)號(hào):52023 // 年齡:23 };簡(jiǎn)而言之,我們使用在一對(duì)花括號(hào)中括起來(lái)的初始化列表進(jìn)行初始化,各初始化項(xiàng)用逗號(hào)分隔。
為了讓初始化項(xiàng)與結(jié)構(gòu)中各成員的關(guān)聯(lián)更加明顯,我們讓每個(gè)成員的初始化項(xiàng)獨(dú)占一行。這樣做只是為了提高代碼的可讀性,對(duì)編譯器而言,只需要用逗號(hào)分隔各成員的初始化項(xiàng)即可。
C99和C11為結(jié)構(gòu)提供了指定初始化器(designated initializer)。其初始化器使用點(diǎn)運(yùn)算符和成員名。例如,只初始化student結(jié)構(gòu)中的name成員,可以這樣做:
?
也可以按照任意順序使用指定初始化器:
struct student stu1 ={.age = 24,.num = 520,.name = "ZhengNianJun" };另外,對(duì)特定成員的最后一次賦值才是它實(shí)際獲得的值。例如,考慮如下代碼:
struct student stu1 ={.num = 520,.name = "ZhengNianJun",1314 };此時(shí),賦給num的值應(yīng)該是1314,因?yàn)樗诮Y(jié)構(gòu)聲明中緊跟在name成員之后。新值1314取代了之前的520。
指定初始化器在實(shí)際編程中也很常用到。如在linux2.6.32.2源碼的usb驅(qū)動(dòng)中(路徑為:linux-2.6.32.2\drivers\usb\storage\usb.c),有如下代碼:
訪問(wèn)結(jié)構(gòu)體成員
結(jié)構(gòu)體成員的訪問(wèn)需要借助結(jié)構(gòu)體成員運(yùn)算符——點(diǎn)(.)。如:
student stu1; // 定義一個(gè)結(jié)構(gòu)體變量stu1 stu1.name = "ZhengNianJun"; // 給stu1的成員name賦值 stu1.num = 520; // 給stu1的成員num賦值 stu1.age = 23; // 給stu1的成員age賦值實(shí)例
#include <stdio.h>typedef struct student {char *name; // 學(xué)生名字int num; // 學(xué)生學(xué)號(hào)int age; // 學(xué)生年齡 }student;int main(void) {student stu1; // 定義一個(gè)結(jié)構(gòu)體變量stu1/* 給結(jié)構(gòu)體變量stu1的成員進(jìn)行賦值 */stu1.name = "ZhengNianJun";stu1.num = 520;stu1.age = 23;printf("\n============================================\n");printf("My name is %s\n", stu1.name);printf("My num is %d\n", stu1.num);printf("My age is %d\n", stu1.age);printf("歡迎關(guān)注正念君編程學(xué)習(xí)筆記!\n", stu1.age);printf("============================================\n");return 0; }?
程序運(yùn)行結(jié)果為:
?
結(jié)構(gòu)體是一塊很重要的內(nèi)容,用得很多。關(guān)于結(jié)構(gòu)體的內(nèi)存對(duì)齊可查看往期筆記:【C語(yǔ)言筆記】結(jié)構(gòu)體內(nèi)存對(duì)齊問(wèn)題
以上就是關(guān)于結(jié)構(gòu)體的一些筆記,如有錯(cuò)誤歡迎指出。謝謝!
歡迎微信掃描左側(cè)二維碼或者在微信搜索zhengnian-2018關(guān)注我的微信公眾號(hào)查看更多編程學(xué)習(xí)筆記!
原文鏈接:https://blog.csdn.net/zhengnianli/article/details/87568902
總結(jié)
以上是生活随笔為你收集整理的【C语言笔记结构体】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UNIX再学习 -- 网络与网络协议
- 下一篇: 给即将35岁的产品经理提个醒