前言:數組只能存儲相同類型的數據,使用構造類型可以在一個結構中存儲不同類型的數據還保持了數據的獨立性;提高了信息處理的能力;
1 結構體 struct
1.1 基本結構體
1.1.1 結構體聲明
struct Book{ char title[100]; float price; }; /*結構體定義表明了該結構體是如何存儲數據的的形式,相當於一種數據類型struct Book;不是實體;*/ /*結構體聲明不是函數定義,可以聲明在函數內外,頭文件中等;*/
1.1.2 結構體初始化
struct Book library={ "C Primer Plus ", 53.5 }; /*定義變量,並按順序初始化*/ struct Book library1={ .price=35.5, .title="C Program" }; /*定義變量,並用初始化器初始化*/ struct Book{ char title[100]; folat price; } library1={"C Program",35.5}; /*聲明結構體,並定義變量及初始化*/
1.1.3 結構體成員調用
printf("title:%s",library1.title ); /*成員運算符的優先級max,結構體成員與普通變量使用方法一樣;漢字屬於字符串;*/ /*如果一個結構體成員還是結構體,初始化或者調用的時候是使用結構體內的結構體的成員;要層級調用;*/
1.2 結構體數組:數組元素是結構體變量的數組;
1.2.1 聲明
struct Book library3[100]; /*library3具有100個元素,每個元素都是一個struct Book類型的對象;*/
1.2.2 初始化
library3[0]={"book name",35.9};
1.2.3 調用
printf("book name == %s ", library3[0].title ); printf(" k == %s ", library[0].title[3] ); printf(" 35.9 == %.2f ", library3[0].price );
1.3 指向結構體變量的指針:傳遞的是結構體變量的起始地址
1.3.1 指向結構體的指針聲明
/*先假設有兩個結構體如下:*/ struct Friends{ char friend1[20]; char friend2[20]; }; struct Info{ char name[20]; int age; struct Friends connct_people }; struct Info ZHANGSAN={ "zhang san",24,{"lee si ", "wang wu"}}; /*聲明一個指向struct Info類型的指針*/ struct Info * ptr_Info ; ptr_Info= &ZHANGSAN;
1.3.2指向結構體的指針調用
printf("name==zhang san %s ", ( * ptr_Info).name ); printf("age == %d" , ptr_Info -> age ); /* 結構體變量.成員 = (* 結構體指針).成員 = 結構體指針->成員 */ /*. 運算符和->運算符的優先級高於自加加運算符 */ ptr_Info->age++; //先取出age的值,使用后值加1; ++ptr_Info->age ; //取出age的值,值加1后使用; (++ptr_Info) ->age ; //先將指針移動至下一個結構體變量,然后使用age的值??應該是這個意思
1.4 結構體與函數參數的聯系
1.4.1 使用結構體成員作為函數實參傳遞
#include<stdio.h> struct Fund{ double bankfund; double save; } David={300.2 , 400.3}; double sum(double total,double save_money) { return ( total+save_money ) ; } int main(void) { printf(" %.2f " , sum(David.bankfund , David.save ) ) ; }
1.4.2 使用指向結構體變量的指針 作為函數實參傳遞
#include<stdio.h> struct Fund{ double bankfund; double save; } David={300.2 , 400.3}; double sum( const struct Fund * money ) { return ( money->bankfund + (* money).save ) ; } /*傳遞的是指向結構體的指針,養成習慣給它加個const,防止數據串改;*/ int main(void) { printf(" %.2f " , sum( &David ) ) ; }
1.4.3 使用結構體變量 作為函數實參傳遞
#include<stdio.h> struct Fund{ double bankfund; double save; } David={300.2 , 400.3}; double sum( const struct Fund Struct_money ) { return ( Struct_money.bankfund + Struct_ money.save ) ; } /*傳遞的是指向結構體的指針,養成習慣給它加個const,防止數據串改;*/ int main(void) { printf(" %.2f " , sum(David ) ) ; }
1.4.4 結構體類型相同的變量可以互相賦值,並給新的相同類型的結構體變量初始化;(感覺並不值得特別指出,但是也不想丟棄的特性;)
2 聯合體 union:把幾種不同類型的變量存放在同一段內存中,同一時刻的共用體變量只有一個值;
2.1 聲明
union favorite{ int num; char fruit[20]; }; union favorite Bob="apple" ; /*創建並初始化了union favorite類型的變量Bob;*/ union favorite Bob= 8 ; /*重新初始化Bob對象為8;前面的apple被清除了*/ /*使用方法和struct相同,但是聯合體基本用不上;*/
3 枚舉 enum:用變量名來表示整型常量;
3.1 聲明枚舉類型
enum color {red, orange, yellow, green, blue,violet }; /*創建一個enum colorType的枚舉類型 */ /*默認從0開始初始化,依次加1給下一個常量初始化;*/
3.2初始化枚舉類型
enum color {red=1,yellow=3,blue = 5}; /*聲明的同時初始化常量,常量初始化之后不可以在調用過程中修改;*/ enum color {red , yellow, blue =5, green }; /*red默認為0,yellow默認遞增為1,blue為5,green遞默認遞增為6;*/
