繼上面的基礎模塊知識之指針之後,我們對數據結構的預備知識——結構體進行記錄學習。
在學習 Java之後,我們對面向對象的編程方法更爲習慣,因爲類Class的出現,讓我們對“萬事萬物皆對象”的理念更爲深刻的理解,這也符合人們的思維習慣,並提高開發代碼的重用性,從而提高開發效率,在C語言中我們發現結構體(struct)和java中的Class有着異曲同工之妙。
1、結構體是一種新的數據結構類型,因爲我們已經知道int、char、float等是基本數據類型。通過封裝基本數據類型來構造結構體,並使用該結構體來定義變量。來實現類似Java中的class的類似數據結構:如下
struct Student
{
int num;
char name[20];
char sex;
float score;
}student1,student2……;//這類似於Java中類的實例化對象student1,2
2、也可以在其他函數中通過語句“struct Student student1”來引用該結構體變量。同時,類似地,使用“.”可以訪問結構體的內部屬性。如下:
#include<stdio.h>
struct Student
{
int num;
char name[20];
char sex;
float score;
};
int main ()
{
struct Student s1;//構造實例化結構體變量
printf("\n請輸入學生的學號:\n");
scanf("%d",&s1.num);
printf("\n請輸入學生的姓名:\n");
scanf("%s",s1.name);
//清空緩衝區字符
getchar();
printf("\n請輸入學生的性別:\n");
scanf("%c",&s1.sex);
printf("\n請輸入學生的成績:\n");
scanf("%f",&s1.score);
printf("\n學生信息如下:%d, %s,%c ,%f\n",s1.num,s1.name,s1.sex,s1.score);
return 0;
}
3.結構體數組,注意以下的數組個數的指定,和不指定數組個數的動態數組,也就是student[]={}空其代碼如下:
#include<stdio.h>
struct Student
{
int num;
char name[20];
char sex;
float score;
}stu[5]=
{
{10101,"王明輝",'n',78},
{10102,"王明",'n',78.8},
{10101,"王明輝",'n',78},
{10101,"王明輝",'n',78},
{10101,"王明輝",'n',78}
};
/*也可以不指定數組的數量,而是使用空*/
int main ()
{
int i;
for(i = 0;i<5;i++){
printf("第%d個學生信息:%d,%s,%c,%f\n",i+1,stu[i].num,stu[i].name,stu[i].sex,stu[i].score);
}
printf("\n");
return 0;
}
4.結構體指針。同樣地,結構體也有內存地址,也可以由一個指針變量指向其地址。然後就可以實現通過指針來訪問結構體各成員。如下代碼:
#include<stdio.h>
struct Student
{
int num;
char name[20];
char sex;
float score;
};
/*
指針運算符
“->”
例如:
stu.num
*p.num
stu -> num
實際上是等價的。
*/
int main ()
{
struct Student s1;
struct Student *p;
p= &s1;//指向結構體的指針變量 s
printf("請輸入學生的學號:\n");
scanf("%d",&(*p).num);
printf("請輸入學生的姓名:\n");
scanf("%s",&(*p).name);
//清空緩衝區字符
getchar();
printf("請輸入學生的性別:\n");
scanf("%c",&(*p).sex);
printf("請輸入學生的成績:\n");
scanf("%f",&(*p).score);
printf("學生信息如下:%d, %s,%c ,%f\n",(*p).num,(*p).name,(*p).sex,(*p).score);
return 0;
}
5.指針運算符“->”可以實現對結構體內對象的訪問,綜合來說,就是:
stu.num
*p.num
stu -> num
實際上是等價的。
6.結構體的嵌套
結構體的成員除了基本數據類型之外,還可以是結構體類型。這就是結構體嵌套。以下是上述例子的改寫:
#include<stdio.h>
struct date
{
int year;
int month;
int day;
};
struct Student
{
int num;
char name[20];
char sex;
struct date birthday;
float score;
} s1={10010,"want",'n',{1994,05,15},78.2};
int main()
{
printf("學生信息如下:\n學號:%d \n姓名:%s \n性別:%c \n生日:%d年 %d月 %d日 \n成績:%f",s1.num,s1.name,s1.sex,s1.birthday.year,s1.birthday.month,s1.birthday.day,s1.score);
return 0;
}