在程式編寫中,我們難免會遇到一些複雜的資料型別無法用單一的普通資料型別表示,於是我們便可以通過使用結構體來定義屬於我們自己的資料型別。所謂結構體是一些值的集合,這些值成為成員變數。結構體的每個成員可以是不同型別的變數。我們將乙個個物件進行抽象,提取其中最關鍵的最核心的資訊,加以表示,並通過結構體的方式表現出來,這樣的模式,有點類似於cpp的物件導向的程式設計,但在cpp中物件和類的概念還要更為強大,更為廣泛。
例如我們要描述乙個學生,我們可以將學生的基本資訊宣告為乙個結構體,有了學生型別的結構體我們想要定義學生型別的變數則易如反掌了。
struct student
;
通過以上的**,我們則定義好了乙個名為student
,有兩個成員變數name
和id
的結構體,但是由於在c語言中單純使用結構體定義變數要加上struct
關鍵字例如struct student stu1;
,十分麻煩,因此,我們往往用typedef
關鍵字將其進行重新命名來簡化使用,例如以下的**段。
typedef struct _student
student;
有了這樣的宣告,我們則可以更簡單的定義結構體變數,例如student stu1;
。
定義結構體變數的定義主要分為兩種方法,一種是在宣告時進行定義,另一種是在使用時進行定義。我們先來學習如何在宣告時進行定義。
struct student
stu1, stu2;
使用以上的方法我們則在宣告結構體的同時定義了兩個個名為stu1
和stu2
型別為student
的變數。但是要奇蹟這種方法如果在使用typedef
關鍵字的情況下無法使用。
接下來我們在使用時再進行變數的定義。
#define _crt_secure_no_warnings
#include //新增標頭檔案
#include typedef struct student
student;
int main()//主函式,函式入口
可以看出使用結構體定義變數的方法和使用普通資料型別定義變數的方法別無二致。在此我依然提倡大家使用typedef
關鍵字對結構體進行重新命名,這樣使得我們使用起來更為方便,不過這種習慣在cpp中就可以摒棄了,因為在cpp中哪怕不使用typedef
關鍵字,結構體型別定義變數時也不需要加struct
關鍵字。
初始化在定義完結構體變數後我們就可以對結構體變數進行初始化,同樣的,分為在宣告時進行初始化和在使用時進行初始化。我們先學習第一種情況。
struct student
stu1 = , stu2 = ;
這種初始的方式是和在宣告時定義變數的方式一起連用的,達到可以快速定義變數並初始化的效果。這種初始化的語法與陣列初始化的語法十分相似,我們都要按照結構體內成員變數的順序依次初始化,
接下來是在使用時定義變數的情況。
#define _crt_secure_no_warnings
#include //新增標頭檔案
#include typedef struct student
student;
int main()//主函式,函式入口
; student stu2 = ;
system("pause");
}
結構體初始化的方式大同小異,都與陣列的初始化十分相似,大家在實際使用中,視情況進行使用。
結構體變數訪問成員
在結構體的使用過程中,最常使用的就是訪問乙個結構體變數的成員變數,不過好在c語言中結構體成員的訪問十分的方便和快捷。我們只需要使用乙個我們之前提到過的訪問結構體成員變數操作符.
即可。
#define _crt_secure_no_warnings
#include //新增標頭檔案
#include typedef struct student
student;
int main()//主函式,函式入口
; student stu2 = ;
printf("stu1的姓名為:%s,學號為:%d\n", stu1.name, stu1.id);
printf("stu2的姓名為:%s,學號為:%d\n", stu2.name, stu2.id);
system("pause");
}
結構體的成員變數也不過是乙個普通資料型別的變數,使用起來與普通資料型別別無二致,前提是我們要將其從結構體變數中訪問到。從**中大家可以看出我使用結構體變數.成員變數名
的方式即可輕易訪問到乙個結構體變數的成員變數。
結構體指標訪問成員變數
結構體指標訪問結構體成員變數的方法與結構體變數訪問成員變數的方法類似,只不過我們要將其中的.
換為->
。
#define _crt_secure_no_warnings
#include //新增標頭檔案
#include typedef struct student
student;
int main()//主函式,函式入口
; student* stu2 = &stu1;
printf("stu1的姓名為:%s,學號為:%d\n", stu2->name, stu2->id);
system("pause");
}
在結構體使用的過程中,我們宣告乙個結構體的成員變數為另外乙個結構體型別,這樣來達到多重巢狀表達複雜資料型別的效果。以下我將展示乙個結構體多重巢狀的例子。
#define _crt_secure_no_warnings
#include //新增標頭檔案
#include #include typedef struct student
student;
typedef struct area
area;
typedef struct city
city;
typedef struct province
province;
typedef struct country
country;
int main()//主函式,函式入口
大家在使用結構體巢狀來表示資料型別時務必要注意開闢合適的內寸空間,在上面的例子中我們每乙個巢狀中的結構體都有著10倍的student
型別的變數的大小,綜合起來已經開闢了十分多的內寸空間,如果我們此時將student
中的大小改為1024大家就會發現程式已經閃退了,這就是我們過度占用記憶體系統為了保護自身所作出的反應機制。
結構體變數的引數傳遞與普通變數幾乎完全一樣,因此我們依舊分為兩種方式進行講解。
形參傳遞
與普通引數傳遞一樣,這種只傳入形參的方法不會對原本結構體變數的內容進行改變。
#define _crt_secure_no_warnings
#include //新增標頭檔案
#include #include typedef struct student
student;
void func(student stu)
int main()//主函式,函式入口
; func(stu);
printf("在函式外部學生的學號為:%d\n", stu.id);
system("pause");
}
指標傳遞
傳入結構體指標來進行結構體變數的傳遞使得結構體在過大的情況下更為方便,省去了編譯器將變數重新複製乙份的時間,更節省空間和時間,是我最為推薦的傳遞方式。即使我們並不想函式隨意更改我們的結構體變數,我們也只需要傳遞指向常量的結構體指標即可,這樣的指標如何定義我在指標章節已經詳細講過。
#define _crt_secure_no_warnings
#include //新增標頭檔案
#include #include typedef struct student
student;
void func(student* stu)//如果需要給乙個指向常量的指標則需要改為 const student* stu;
int main()//主函式,函式入口
; func(&stu);
printf("在函式外部學生的學號為:%d\n", stu.id);
system("pause");
}
C語言第七章 C語言結構體
一,什麼是結構體 c語言中給我們提供了基本的資料型別,例如 int,double,char等,但是有些時候是無法滿足我們的要求的,例如我們要儲存乙個學生整體,這個學生有姓名,身高,成績等多個字段組成,所以我們需要一種復合的資料型別,因此c語言了結構體這個概念。把一些基本的資料型別組合在一起,形成乙個...
第七章 結構體
1.結構 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。2.結構的宣告 include 描述學生 struct 結構體關鍵字 stu 結構體標籤 struct stu 結構體型別 定義乙個結構體型別 struct stus1,s2,s3 分號不能丟 s1,s2,s3是三...
C語言 第七章
一 在計算機中,位 bit 是表示和儲存資訊的最小單位,1b 8bit。c 語言提供一種在位一級進行操作的機制。它允許在乙個結構體中以位為單位來指定其成員所佔記憶體的長度,這種以位為單位的成員稱為 位段 或 位域 例如 struct a unsigned aa 1 unsigned bb 1 uns...