C語言結構體類型定義+結構體變量的定義與使用及其初始化+結構體變量作為函數參數
- 結構體
- 引例
- 結構體變量的定義
- 結構體變量的使用
- 結構體變量作為函數參數
- 結構體變量的初始化
- 下一篇文章
結構體
引例
輸出平均分最高的學生資訊
#include <stdio.h>
struct student
{
int num;
char name[10];
int computer,english,math;
double average;//這些都是結構體成員
};//注意這個分号不要可少,否則會報錯
int main()
{
int i,n;
struct student s1,max;//定義結構體變量s1和結構體變量max
printf("Input n:");
scanf("%d",&n);//n是學生的個數
printf("Input the student's number, name and course scores:\n");
for(i=1;i<=n;i++)//用for循環實作n個學生成績的輸入
{
printf("No.%d:",i);//提示學生的序号
scanf("%d%s%d%d%d",&s1.num,s1.name,&s1.math,&s1.english,&s1.computer);
//分别給結構體裡面的變量輸入數值
s1.average=(s1.math+s1.english+s1.computer)/3.0;//計算出該學生的平均成績
if(i==1)max=s1;
if(max.average<s1.average)//找出平均分最高的學生
max=s1;//将s1裡面的成員變量的值分别對應地指派給max
}
printf("num:%d, name:%s, average:%.2lf\n",max.num,max.name,max.average);
//将平均成績最高的學生成績輸出
return 0;
}
-
結構體類型的定義:
結構體類型實際上是一種模闆,它的定義形式為:
struct 結構體名
{
類型辨別符 結構體成員名1;
類型辨別符 結構體成員名2;
...
類型辨別符 結構體成員名3;
};//最後的這個分号不要忘了
注意不要忘記最後的分号
結構體變量的定義
在結構體類型定義好的情況下,注意是結構體類型定義好的情況下,才能定義結構體變量。
比如:
struct student
{
int num;
char name[10];
int computer,english,math;
double average;
};
這個是結構體類型的定義,然後才能進行結構體變量的定義:
struct 結構體類型名 結構體變量名;
struct student stu1,stu2;//定義兩個結構體變量
也可以在定義結構體類型的時候同時定義結構體變量,如:
struct student
{
int num;
char name[10];
int computer,english,math;
double average;
}stu1,stu2;//定義兩個結構體變量;
也可以省略結構體類型名,如:
struct//省去了結構體類型的名字student
{
int num;
char name[10];
int computer,english,math;
double average;
}stu1,stu2;//定義兩個結構體變量;
省略了結構體類型的名字,在這種情況下,結構體變量隻能在後面同時定義,而不能在主函數中定義。是以并不建議這樣定義結構體變量
- 注意:結構體變量的變量名和成員名可以相同,二者互不影響,互不幹擾,如:
struct date
{
int year;
int month;
int day;
};
int main()
{
struct date year;
year.year = 1980;
}
結構體變量的使用
使用形式為:
結構體變量.結構體成員名
scanf("%d%s%d%d%d",&s1.num,s1.name,&s1.math,&s1.english,&s1.computer);
- 注意:如果結構體類型中有字元數組成員,并且在主函數中要給字元數組賦字元串常量時,不能直接用“=”,即
是錯誤的,必須使用字元串複制函數strcpy()函數來實作,如:s1.name="張三";
strcpy(s1.name,"張三");
-
同一類型的結構體變量間可以指派
如:
将結構體變量stu1裡面的所有成員變量的值分别對應賦給結構體變量stu2stu2=stu1;
結構體變量作為函數參數
- 結構體變量的成員作為函數的實參,形參為普通變量或數組
-
也可以将結構體變量作為函數的參數
例如:(請看代碼中的詳細注釋,并觀察運作結果)
#include <stdio.h>
#include <string.h>
struct s_score
{
int no;
char name[10];
int score[3];
};//不要忘記這個分号
void output(struct s_score a);//形參為結構體變量
void fun(int *q);//形參為指針
main()
{
struct s_score a={1001,"zhangsan",{60,60,60}};//這行語句是對結構體變量的初始化
output(a);
a.no=1001;
strcpy(a.name,"wang lin");
a.score[0]=78;
a.score[1]=88;
a.score[2]=94;
output(a);
fun(a.score);//結構體中的數組成員,數組名為數組首位址
output(a);
}
void output(struct s_score a)//将結構體變量作為形參接收來自主函的結構體變量
{
int i;
printf("%d %s ",a.no,a.name);
for(i=0;i<3;i++)
printf("%4d",a.score[i]);
printf("\n");
}
void fun(int *p)//定義指針變量來接收主函數傳入的數組首位址
{
int i;
for(i=0;i<3;i++)
{
*(p+i)+=10;//通過循環變量i來對指針變量進行運算
if(*(p+i)>100)
*(p+i)=100;
}
}
結構體變量的初始化
struct s_score a={1001,"zhangsan",{60,60,60}};
- 1