結(jié)構(gòu)(structure) 或叫 結(jié)構(gòu)體
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了景泰免費建站歡迎大家使用!"結(jié)構(gòu)"是一種構(gòu)造類型,它是由若干"成員"組成的,每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型.
結(jié)構(gòu)既是一種"構(gòu)造"而成的數(shù)據(jù)類型,那么在說明和使用之前必須先定義它,也就是構(gòu)造它,如同在說明和調(diào)用函數(shù)之前要先定義函數(shù)一樣
為什么要有結(jié)構(gòu)體?
結(jié)構(gòu)體可以把功能相同的數(shù)據(jù)組織起來,存在一起,用得時候方便.而且在調(diào)用函數(shù)時,若傳遞參數(shù)較多,傳一個結(jié)構(gòu)體相對而言簡單一些,很多系統(tǒng)自帶的函數(shù)必須用結(jié)構(gòu)體
定義結(jié)構(gòu)體的方法
定義一個結(jié)構(gòu)的一般形式為: struct 結(jié)構(gòu)名{ 成員列表 }; 例: 定義一個學(xué)生的結(jié)構(gòu) struct stu{ int num; char name[10]; //char *name; };結(jié)構(gòu)體變量的定義有三種方法
1)先定義結(jié)構(gòu)體,然后在定義結(jié)構(gòu)體變量結(jié)構(gòu)體變量中成員的訪問
形式:結(jié)構(gòu)體變量初始化
struct Student{ int sno; char name[21]; int age; float score; }; 初始化: 1): struct Student str; str.sno=1; str.name="abc" //這種方式是錯誤的 strcpy(str.name,"abc"); str.score = 59.99f 2): 定義結(jié)構(gòu)體變量的同時,進行初始化 初始化值的順序要和定義結(jié)構(gòu)體的順序一致 struct Student stu2 ={8,"哈哈",2,4.5f} 問題: 1.stu1.name 占用多少個字節(jié) printf("%d ",sizeof(stu1.name)); //21 2.stub.name 字符串長度是多少 printf("%ld",strlen(stu1.name)); //9 //漢字的編碼問題 //utf-8 xcode中默認的中文的編碼是utf-8 ,國際通用編碼, 一個漢子占用3個字節(jié) //GB2312 GBK 國標 一個漢字占用2個字節(jié)結(jié)構(gòu)體存儲原理
結(jié)構(gòu)體占用的內(nèi)存空間是每個成員占用的字節(jié)數(shù)之和(考慮對齊問題);
結(jié)構(gòu)體大小的計算方法和步驟
1)將結(jié)構(gòu)體內(nèi)所有數(shù)據(jù)成員的長度相加,記為sum_a; 2)將各數(shù)據(jù)成員為了內(nèi)存對齊,按各自對齊模數(shù)而填充的字節(jié)數(shù)累加到和sum_a上,記為sum_b。對齊模數(shù)是#pragma pack 指定的數(shù)值以及該數(shù)據(jù)成員自身長度中數(shù)值較小者.該數(shù)據(jù)相對起始位置應(yīng)該是對齊模式的整數(shù)倍 3)將和sum_b向結(jié)構(gòu)體模數(shù)對齊,該模數(shù)是#pragma pac指定的數(shù)值和結(jié)構(gòu)體內(nèi)部大的基本數(shù)據(jù)類型成員長度中數(shù)值較小者.結(jié)構(gòu)體的長度應(yīng)該是該模數(shù)的整數(shù)倍 所謂"對齊在N上" ,指定是"存放起始地址%N=0" struct A{ int a; //4 char b; //分配4個,用了1個,剩下3個 short c; //需要2個 }; printf("%ld ",sizeof(stuct A)); //上面的話是書上的 // 1)找對齊模數(shù) // 對齊模數(shù): 是結(jié)構(gòu)體中的基本數(shù)據(jù)類型中占用字節(jié)數(shù)大的那個 // 2)在計算結(jié)構(gòu)體變量中各個成員占用的字節(jié)和枚舉也是一種結(jié)構(gòu)體
枚舉: 枚舉類型是一種基本數(shù)據(jù)類型,而不是一種構(gòu)造類型,因為它不能再分解任何基本類型 格式: enum 枚舉類型{枚舉值1,枚舉值2....} 枚舉變量的值: 枚舉類型定義完成以后,系統(tǒng)會自動給枚舉的每個元素都會賦值一個整形的初值 初值:從第一個元素開始,值為0,后面元素的值是其上一個元素值+1;