一、結構體
在前面的數組分享中,把同一類型的數據進行保存通過數組,我們可以用數組來表示這個整體,但是數組有個特點:內部的每一個元素都必須是相同類型的數據。那麼如何通過一個方式將不同類型的數據進行存儲呢?
為此,C語言專門提供了一種構造類型來解決上述問題,這就是結構體,它允許內部的元素是不同類型的。
二、結構體的定義
1.先定義結構體類型, 在定義結構體變量
struct student {
int age ;
char *name;
double height;
};
struct student sd;
2.定義結構體類型的同時定義結構體變量
struct student2{
int age;
char *name;
double height;
}sd2;
sd2.age = 16;
sd2.name = “JAMES”;
sd2.height = 1.9;
3.定義結構體類型的同時定義結構體變量, 並且省略結構體名稱
struct {
int age;
char *name;
double height;
}sd3;
sd3.age = 17;
sd3.name = “james”;
sd3.height = 1.88;
定義結構體類型的同時定義結構體變量, 並且省略結構體名稱的注意:
弊端: 由於結構體類型沒有名稱, 所以以後就不能使用該結構體類型
優點: 如果結構體類型只需要使用一次, 那麼可以使用該方式
三、結構體初始化
1.定義的同時初始化
struct student sd = {18,”james”,1.87};
2.先定義後初始化(一次性初始化)
struct student sd2;
sd2 = (struct student){18,”james”,1.98};
3.先定義再初始化(逐個初始化)
struct student sd3;
sd3.name = “james”;
sd3.age = 18;
sd3.height = 1.87;
4.指定將數據賦值給指定的屬性
struct student sd4 = {.height = 1.76,.age = 19,.name = “james”};
四、結構體數組
跟結構體變量一樣,結構體數組也有3種定義方式:
方式一:
struct Student {
char *name;
int age;
};
struct Student stu[5]; //定義1
方式二:
struct Student {
char *name;
int age;
} stu[5]; //定義2
方式三:
struct {
char *name;
int age;
} stu[5]; //定義3
結構體數組的初始化:
truct {
char *name;
int age;
} stu[2] = { {“Jmes”, 21}, {“JJ”, 30} };
五、結構體函數
將結構體變量作為函數參數進行傳遞時,其實傳遞的是全部成員的值,也就是將實參中成員的值一一賦值給對應的形參成員。因此,形參的改變不會影響到實參。相當於拷貝。
// 定義一個結構體
struct Student {
int age;
};
void test(struct Student stu) {
printf(“修改前的形參:%d ”, stu.age);
// 修改實參中的age
stu.age = 10;
printf(“修改後的形參:%d ”, stu.age);
}
int main(int argc, const char * argv[]) {
struct Student stu = {30};
printf(“修改前的實參:%d ”, stu.age);
// 調用test函數
test(stu);
printf(“修改後的實參:%d ”, stu.age);
return 0;
}
六、指向結構體的指針
結構體指針變量的定義形式:struct 結構體名稱 指針變量名*
有了指向結構體的指針,那麼就有3種訪問結構體成員的方式
結構體變量名.成員名
(*指針變量名).成員名
指針變量名->成員名<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPmludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKSB7PGJyIC8+DQovLyC2qNLl0ru49r3hubnM5cDg0M08YnIgLz4NCnN0cnVjdCBTdHVkZW50IHs8YnIgLz4NCmNoYXIgKm5hbWU7PGJyIC8+DQppbnQgYWdlOzxiciAvPg0KfTs8YnIgLz4NCi8vILao0uXSu7j2veG5uczlseTBvzxiciAvPg0Kc3RydWN0IFN0dWRlbnQgc3R1ID0geyZsZHF1bztNSiZyZHF1bzssIDI3fTs8YnIgLz4NCi8vILao0uXSu7j21rjP8r3hubnM5bXE1rjV67Hkwb88YnIgLz4NCnN0cnVjdCBTdHVkZW50ICpwOzxiciAvPg0KLy8g1rjP8r3hubnM5bHkwb9zdHU8YnIgLz4NCnAgPSAmYW1wO3N0dTs8YnIgLz4NCi8v1eLKsbryv8nS1NPDM9bWt73KvbfDzsq94bm5zOW1xLPJ1LE8YnIgLz4NCi8vILe9yr0xo7q94bm5zOWx5MG/w/sus8nUscP7PGJyIC8+DQpwcmludGYoJmxkcXVvO25hbWU9JXMsIGFnZSA9ICVkICZyZHF1bzssIHN0dS5uYW1lLCBzdHUuYWdlKTs8YnIgLz4NCi8vILe9yr0yo7ooKta41eux5MG/w/spLrPJ1LHD+zxiciAvPg0KcHJpbnRmKCZsZHF1bztuYW1lPSVzLCBhZ2UgPSAlZCAmcmRxdW87LCAoKnApLm5hbWUsICgqcCkuYWdlKTs8YnIgLz4NCi8vILe9yr0zo7rWuNXrseTBv8P7LSZndDuzydSxw/s8YnIgLz4NCnByaW50ZigmbGRxdW87bmFtZT0lcywgYWdlID0gJWQgJnJkcXVvOywgcC0mZ3Q7bmFtZSwgcC0mZ3Q7YWdlKTs8YnIgLz4NCnJldHVybiAwOzxiciAvPg0KfTwvcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20150803/20150803162051182.png" title="\" />
七、結構體如何開辟存儲空間
看上去, 結構體分配存儲空間是將所有屬性占用的存儲空間的總和加在一起後再分配
注意:
其實結構體分配存儲空間本質上並不是將所有屬性占用的存儲空間的總和加在一起後再分配
而是會獲取結構體類型中占用內存最大的屬性的大小, 然後取該大小的倍數
特例:
如果剩余的存儲空間”不夠”存儲將要存儲的數據, 那麼就會重新開辟8個字節的存儲空間, 並且將需要存儲的數據放到新開辟的存儲空間中。
如果剩余的存儲空間”夠”存儲將要存儲的數據, 那麼就不會開辟了。
八、枚舉
枚舉就是專門用於表示幾種固定類型的取值,枚舉的本質就是基本數據類型, 就是整型。在iOS開發中是非常常用的。
枚舉類型定義的格式
enum 枚舉類型名稱{
類型1,
類型2,
};
注意:由於枚舉類型的本質是整型, 所以枚舉類型除了可以接收枚舉的固定的取值以外, 還可以接收其它整型的值,枚舉的值默認從0開始依次遞增。
定義枚舉的一般規范:
*(1)枚舉類型的取值一般以k開頭 後面跟上枚舉類型的名稱 跟上當前取值的含義
(2)和結構體一樣, 枚舉類型的名稱首字母大寫*
enum Season
{
kSeasonSpring,
kSeasonSummer,
kSeasonAutumn,
kSeasonWinter
};