日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【C语言笔记结构体】

發(fā)布時(shí)間:2025/3/15 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言笔记结构体】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們都知道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 ={.name = "ZhengNianJun" };

也可以按照任意順序使用指定初始化器:

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。