在開發過程當中,常常會須要處理一組不一樣類型的數據,好比學生的我的信息,由姓名、年齡、性別、身高等組成,由於這些數據是由不一樣數據類型組成的,所以不能用數組表示,對於不一樣數據類型的一組數據,能夠採用結構體來進行存儲。固然,對於面向對象的語言來講,最好是用類來表示,可是C語言是面向過程的,所以選擇用結構體來表示。web
一.結構體的定義 |
struct 結構體名{ 類型名 成員名1; 類型名 成員名2; ... ... 類型名 成員名n; };
二.結構體的變量聲明 |
代碼數組
// // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 定義學生信息的結構體 */ struct student{ char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 }; int main(int argc, const char * argv[]) { //聲明結構變量 struct student student1; struct student student2; return 0; }
三.定義結構體類型的同時定義變量 |
代碼app
// // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 定義學生信息的結構體,並聲明兩個學生結構變量student1和student12 */ struct student{ char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 } student1, student2; int main(int argc, const char * argv[]) { return 0; }
四. 直接定義結構體類型變量,省略類型名 |
代碼函數
// // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 直接聲明兩個結構體變量student1和student2 */ struct{ char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 } student1, student2; int main(int argc, const char * argv[]) { return 0; }
五.結構體的嵌套 |
代碼spa
// // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 定義日期結構體 */ struct date{ unsigned int year; unsigned int month; unsigned int day; }; /** * 定義學生結構體 */ struct student{ char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 struct date birthday; //出生日期 (date結構體) }; int main(int argc, const char * argv[]) { return 0;
六.結構體的初始化 |
<一> 結構體變量能夠在聲明的時候一次性給多個成員初始化,可是須要注意的是初始化的順序必須和定義結構體成員的順序同樣,初始化成員的個數是能夠少於總成員個數。指針
<二> 聲明結構變量後,能夠採用結構變量名.成員名來爲其賦值或取值。code
<三> 聲明結構變量後,能夠總體接收相同類型的其餘結構變量的值。orm
代碼對象
/ // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 定義日期結構體 */ struct date{ unsigned int year; unsigned int month; unsigned int day; }; /** * 定義學生結構體 */ struct student{ char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 struct date birthday; //出生日期 }; int main(int argc, const char * argv[]) { //<一> 一次性給多個成員賦值 struct date birth1 = {1992, 1, 1}; struct student student1 ={"jredu", 21, 'f', 180.0, birth1}; //<二>對單個成員賦值 student1.age = 20; student1.height = 178.0; //<三>相同類型的變量間可進行總體賦值 struct student student2 = student1; return 0; }
七.結構體的使用 |
結構體是咱們自定義的一種數據類型,可是實際上和系統提供給咱們的基本數據類型的使用是同樣的,所以,除了能夠用結構作變量,還能夠用結構體作數組、指針、函數。blog
用數組來存儲一組結構體類型的變量,好比存放一組學生的結構數組。
在使用結構數組的時候和上面講的結構變量同樣,一樣能夠經過三種方式來獲得結構數組。
代碼
/** * <一>先定義結構體 */ struct student{ char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 } ; int main(int argc, const char * argv[]) { //再聲明結構數組 struct student stus[10]; return 0; }
代碼
/** * <二>定義結構體同時直接聲明結構數組 */ struct student{ char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 } stus[10];
代碼
/** * <三>直接聲明結構數組 */ struct { char name[100]; //姓名 unsigned int age; //年齡 char sex; //性別 double height; //身高 } stus[10];
要想使用指針來間接改變數據,必須用相同類型的指針去指向對象。結構體類型的變量或者數組在使用的時候就須要使用結構體類型的指針。
代碼
// // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 定義結構體 */ struct student{ char *name; //姓名 unsigned int age; //年齡 } ; int main(int argc, const char * argv[]) { //聲明結構變量 struct student student1 = {"jredu", 21}; //定義一個結構指針 struct student *ptr = &student1; //訪問結構成員,好比獲得學生信息 //方式1:直接使用結構變量 printf("name = %s,age = %u\n",student1.name, student1.age); //方式2:經過指針獲得結構變量 printf("name = %s,age = %u\n", (*ptr).name, (*ptr).age); //方式3:直接用指針 printf("name = %s,age = %u\n",ptr->name, ptr->age); return 0; }
代碼
// // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 定義結構體 */ struct student{ char *name; //姓名 unsigned int age; //年齡 } ; void func1(struct student tempStu); void func2(struct student *ptrStu); int main(int argc, const char * argv[]) { //聲明結構變量 struct student student1 = {"jredu", 21}; struct student student2 = student1; //調用參數爲結構變量的函數 func1(student1); printf("student1 name = %s\n",student1.name); //調用參數爲結構變量的函數 func2(&student2); printf("student2 name = %s\n",student2.name); return 0; } void func1(struct student tempStu){ tempStu.name = "apple"; } void func2(struct student *ptrStu){ ptrStu->name = "apple"; }
8、結構體的簡化 |
typedef能夠對數據類型進行重命名,所以在定義結構體的時候能夠使用它來簡化操做。
代碼
// // main.c // 結構體 // // Created by jerei on 15-12-27. // Copyright (c) 2015年 jerehedu. All rights reserved. // #include <stdio.h> /** * 定義結構體 */ typedef struct { char *name; //姓名 unsigned int age; //年齡 } Student; int main(int argc, const char * argv[]) { //聲明結構變量 Student student1 = {"jredu", 21}; return 0; }