一、結構體的定義
1、定義形式
struct 結構名
{成員列表;}; //定義為語句,分號不能丟
2、結構類型變量的聲明
(1)聲明形式1
struct student
{
int number;
char name[10];
float score;
};
struct student st1,st2,st3;
(2)聲明形式2
struct student
{ int number;
char name[10];
float score;
}st1,st2,st3;
(3)結構體變量的賦值
如上例:
struct student
{ int number;
char name[10];
float score;
}st1={101,"wang",87.5};
3、結構數組的定義
struct student
{
int number;
char name[10];
float score;
}stu[50]={
{101,"wang",87.5},
{102,"li",90},
...
}; //定義並初始化50個數組元素,每個元素均具有結構體student的結構。
二、結構指針
1、聲明形式
struct 結構名 *指針變量名 //方法一:須在聲明結構指針變量前應已說明該結構體
struct 結構名
{
結構體
}*指針變量名; //方法二:與結構體變量一樣
2、結構指針的賦值
struct student{
...
};
struct student *p;
struct student st1={..};
p=&st1; //取該結構體變量的首地址
3、通過結構指針變量訪問結構變量成員
若st1為上述student結構體變量,p為該結構體指針變量:
使p=&st1;則可用下列方法訪問st1各成員:
p->num、p->name、p->score。
或(*p).num、(*p).name ...
與st1直接引用:st1.num都可以用來表示st1的成員。
4、指向結構數組的指針
struct student
{
int num;
char name[10];
}stu[10]={...}; //聲明並初始化結構數組stu
struct student *p; //聲明結構指針p
p=stu; //對p賦值,指向數組stu首地址
for(;p
printf("%d,%s",p->num,p->name[10]); //通過指針變量引用結構數組元素的成員
三、動態存儲分配
1、malloc函數
在內存動態存儲區裡分配一塊長度為N字節的連續區域,返回值為該內存區首地址,類型說明符表示該內存區存貯的數據類型,(類型說明符*)表示將該返回值指針強制轉換成該類型指針:
(類型說明符*)malloc(N)
如:
(int*)malloc(100);
(struct student*)malloc(sizeof(struct student));
2、calloc函數
(類型說明符*)calloc(n,N) //動態存儲區內分配n個長度為N字節的連續區域,返回值為該區首地址,(類型說明符*)表示將該返回值指針強制轉換成該類型指針;
3、free函數
free(void*ptr); //釋放指針變量ptr指向的一塊內存空間,使用free函數前:ptr指向的必須是事先通過malloc或calloc分配的區域。
四、鏈表
如何分配空間來存儲學生的數據?可想到使用結構體數組,但如何確定學生的數量?新增或刪減學生如何處理?引申出鏈表描述:
鏈表各元素首先均是一個結構體,各個元素稱為結點,各結點對應結構體內有一成員為指針變量,指向該結點下一個結點的首地址,第0個結點稱為頭結點,僅存有指針變量,指向第1個結點;最後一個結點的指針變量成員指向為空(NULL)。
例:建立一個學生數據的鏈表結構struct student{
char *name;
struct student *pnext; //指向下一個結點的指針變量,下一結點數據類型為結構體
}; //完成鏈表結構聲明
int i;
struct student *head,*p1,*pass;
for(i=0;i