一 、 結構體是什麼?
1.與C語言中的數組,用法跟其他語言差不多。當一個整體由多個數據構成時,可以用數組來表示這個整體,
但是數組有個特點:內部的每一個元素都必須是相同類型的數據。
2.通常需要由不同類型的數據來構成一個整體,比如學生這個整體可以由姓名、年齡、身高等數據構成,
這些數據都具有不同的類型,姓名可以是字符串類型,年齡可以是整型,身高可以是浮點型。
3.C語言專門提供了一種構造類型來解決上述問題,就是結構體,它允許內部的元素是不同類型的。
二 、 結構體有什麼用?
1.更好的管理內存,解決基本數據類型和數組都不好存儲的數據
三 、 結構體怎麼用?
方法一:先定義結構體類型再定義變量名
struct student
{int num;
char name[20];
char sex;
int age;
char addr[30];
};
struct student student1, student2;
有時,可用符號常量代表一個結構體類型 ,如:
#define STUDENT struct student
STUDENT
{int num;
char name[20];
char sex;
int age;
char addr[30];
};
方法二:在定義類型的同時定義變量
struct student
{int num;
char name[20];
char sex;
int age;
char addr[30];
} student1, student2;
方法三:直接定義結構類型變量。
其一般形式是:
struct
{
成員表列
} 變量名錶列;
- 結構體變量的指針:是該結構體變量所佔居的內存段的起始地址,指向該結構體
int main( )
{
struct student
{
long int num;
char name[20];
char sex;
};
struct student stu_1;
struct student *p;
p=&stu_1;
return 0;
}
- 引用結構體成員的三種形式:
1) 結構體變量名 . 成員名
2) (*p).成員名
3) p- >成員名 - 結構體的初始化
struct student
{long int num;
char name[20];
char sex;
char addr[20];
} stu={9801,”Wang hong”,’W’,”2 Linggong Road”};
或者
struct student
{long int num;
char name[20];
char sex;
char addr[20];
};
struct Student stu ={9801,”Wang hong”,’W’,”2 Linggong Road”}
四 、 使用結構體要注意什麼?
1. 類型與變量是不同概念,不要混淆;
2. 結構體中的成員,可以單獨使用,其作 用與地位相當於普通變量;
3. 成員名可以與程序中的變量名相同,二 者不代表同一對象。
4. 成員也可以是一個結構體變量;
5. 不能將一個結構體變量作爲一個整體進行賦值和輸出;只能對其各個成員分別輸出
6. 只能在定義變量的同時進行初始化賦值,初始化賦值和變量的定義不能分開
五 、 結構體代碼舉例
- 例1一般應用
//一個結構體
struct Student {
char *name;
int age;
};
struct Student stu;
// 訪問stu的age成員
stu.age = 27;
//兩個結構體搭配
struct Date {
int year;
int month;
int day;
};
struct Student {
char *name;
struct Date birthday;
};
struct Student stu;
//注意成員變量的訪問
stu.birthday.year = 1986;
stu.birthday.month = 9;
stu.birthday.day = 10;
- 例2結構體作爲函數參數(值傳遞)
#include <stdio.h>
// 定義一個結構體
struct Student {
int age;
};
void test(struct Student stu) {
printf("修改前的形參:%d \n", stu.age);
// 修改實參中的age
stu.age = 10;
printf("修改後的形參:%d \n", stu.age);
}
int main(int argc, const char * argv[]) {
struct Student stu = {30};
printf("修改前的實參:%d \n", stu.age);
// 調用test函數
test(stu);
printf("修改後的實參:%d \n", stu.age);
return 0;
}
- 例3 利用指向結構體數組的指針計算學生各科的平均成績
#include <stdio.h>
int main()
{
struct STUDENT *pt;
float sum[4] = {0.0},average[4] = {0.0};
int i;
char *name[]={"score of Computer","score of English",
"score of Math","score of Music"};
pt = stu; /*pt指向結構體數組的第一個元素*/
for (pt=stu; pt<stu+30; pt++)
{
sum[0] = sum[0] + pt->scoreComputer;//用->訪問成員變量
sum[1] = sum[1] + pt->scoreEnglish;
sum[2] = sum[2] + pt->scoreMath;
sum[3] = sum[3] + pt->scoreMusic;
}
for (i=0; i<4; i++)
{
average[i] = sum[i]/4;
printf("%20s : %4.2f\n", name[i], *(average+i));//格式輸出,平均分保留兩位
}
return 0;
}
六 、 結構體總結
1.不允許對結構體本身遞歸定義
2.結構體內可以包含別的結構體
3.定義結構體類型,只是說明了該類型的組成情況,並沒有給它分配存儲空間,就像系統不爲int類型本身分配空間一樣。
只有當定義屬於結構體類型的變量時,系統纔會分配存儲空間給該變量
4.結構體變量佔用的內存空間是其成員所佔內存之和,而且各成員在內存中按定義的順序依次排列
5.初始化:將各成員的初值,按順序地放在一對大括號{}中,並用逗號分隔,一一對應賦值
6.一般對結構體變量的操作是以成員爲單位進行的,引用的一般形式爲:結構體變量名.成員名
7.如果某個成員也是結構體變量,可以連續使用成員運算符"."訪問最低一級成員
8.相同類型的結構體變量之間可以進行整體賦值
9.將結構體變量作爲函數參數進行傳遞時,其實傳遞的是全部成員的值,也就是將實參中成員的值一一賦值給對應的形參成員。
因此,形參的改變不會影響到實參。
10.每個結構體變量都有自己的存儲空間和地址,因此指針也可以指向結構體變量
11.typedef 的用法 ,功能:定義新類型,即爲C語言中已有的數據類型 名定義一個新名字。 定義格式: typedef 標識符1 標識符2