最近把結構體的部分知識又仔細的研究學習了一下,總結了一下內容,希望者篇文章對那些對結構體模糊的人c結構體
1, 結構體是一種自定義的數據類型,也是用來存儲多個數據的大容器不過結構體要比數組靈活,它可以存儲不同類型的數據
2, 結構體的定義
struct + 結構體名字 {大括號中填寫結構體成員,多個結構體成員之間通過分號間隔}
如下:
struct student {
// 結構體成員
char name[20];//存儲姓名
char sex; // 存儲性別
int number; //存儲學號
int score; // 存儲分數
};// 分號是結構體定義結束的標誌,必不可少
3, typedef 類型重定義,即給已有的類型重新起一個名字,新的名字和原類型具有同樣的功能;
typedef 第一種格式, 先定義結構體類型,然後再typedef
如:typedef int integer;
給結構體類型 struct student 重新定義一個名字Stu
typedef struct student Stu;
typedef 第二種格式, 定義結構體的同時,typedef (這種格式比較常用)
typedef struct point1 {
float abscissa; //存儲橫座標
float ordinate; //存儲縱座標
}Poi1;
其中Poi1此後可以作爲一個數據結構類型應用
如: Poi1 p1 = {};就是定義了一個結構體類型變量p1
4, 結構體變量訪問結構體成員的方式,通過結構體變量.結構體成員,
如: printf("number = %d\n",stu.number);
5, 結構體數組:
// 定義一個學生結構體變量
Stu person[4] = {{"Frank",'f',22,10086,87},{"Duck",'f',28,10087,93},{"Xiaoming",'f',27,10088,93},{"Phone",'f',25,10089,75}};
// 運用結構體數組對學生按成績排序:
for (int i = 0; i < 4; i ++) {
if (person[i].score > scoreMax.score) {
scoreMax = person[i];
}
if (person[i].age < ageMin.age) {
ageMin = person[i];
}
}
6, 結構體內存分配原則
以結構體成員所規定的存儲空間最大的空間大小爲單位來進行分配,是
最大空間的最小整數倍
7, 結構體可以嵌套, 即在一個結構體中的結構體成員是另一個結構體類型的變量
如:先定義一個日期的結構體Date
typedef struct birthday
{
int year;
int month;
int day;
}Birth;
則:結構體嵌套, 在一個結構體中的結構體成員是另一個結構體類型的變量
typedef struct stu {
char name[20]; //存儲學生姓名
char sex; //存儲學生性別
int age; // 存儲學生年齡
int score; //存儲學生分數
Birth birth; //出生日期
}Stu;
8,練習:
1), 定義一個結構體變量(包含年月日),計算該日在本年中爲第幾天?要求寫一個days函數。參數是此結構體類型的變量,返回值是整數。
int days(date dat)
{
int a[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
int day = 0;
BOOL isTrue ; // 用於判斷該年是否爲閏年
// 判斷該年是否爲閏年
if (dat.year % 400 == 0 || (dat.year % 4 == 0 && dat.year % 100 != 0)) {
isTrue = 1; // 如果該年是閏年,令isTrue 爲 1
} else {
isTrue = 0;
}
day += a[dat.month - 1] + dat.day;
day += isTrue && dat.month >= 3 ? 1 : 0;
return day;
}
2), 有5名學生保存在結構體數組中,編程按學生的姓名降序排序
void sortName(Stu a[],int n)
{
for (int i = 0; i < n - 1; i ++) {
for (int j = 0; j < n - 1 -i ; j ++) {
if (strcmp(a[j].name, a[j + 1].name ) < 0) {
Stu temp = a[j]; //temp 爲中間變量,用於交換兩個結構體元素
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}