结构体是一种特殊的数据类型,它可以将很多数据类型打包,然后只要操作该结构体的指针变量便可以轻松的访问该结构体内其他的数据。
举例如下:
struct student
{
CHAR NAME[8];
int age;
CHAR depart[20];
float grade;
}freshman ;
student是结构名,大括号内为该结构体打包的数据类型。如果定义 struct student *p=freshman.NAME,则引用变量p可以指向结构体*p的存储空间首地址。
①成员运算符“.”运行级别高于“*”,所以*p.NAME表示*(p.NAME)。
②定义结构体要在末尾加“;”。
例:简单的机构体赋值和应用
#include <stdio.h>
int main()
{ //定义一个结构体a;
struct student
{
CHAR NAME[8];
int age;
CHAR sex[4];
CHAR depart[20];
float grade1,grade2,grade3;
}a;
printf("\nNAME:"); //输入结构体a中的成员NAME,接着打印到终端
scanf("%s", a.NAME); 此处引用的方式是:结构体变量.成员名
printf("\n%s\n",a.NAME);
return 0;
}
例:定义结构体数组,调用结构体内数据
结构体数组的成员有三种访问方式:
①结构体变量.成员名
②(*结构体指针变量).成员名
③结构体指针变量->成员
#include <stdio.h>
struct stu //定义结构体数组及结构体的初始化
{
int num;
CHAR *NAME;
CHAR sex;
float score;
}pupil[5]={
{101,"Tom",'M',45.8},
{102,"Mike",'M',62.5},
{103,"Chris",'F',92.5},
{104,"Rose",'F',87.6},
{105,"Nate",'M',58.8}
};
void avg(struct stu *ps) //声明无返回值的函数avg,定义其参数是一个结构体指针变量。
{
int c=0,i; //定义两个整型c,i;
float ave,s=0; //定义两个浮点型变量ave,s
for(i=0;i<5;i++,ps++) // i表示循环的次数
{
s+=ps->score; //s表示学生成绩的和
if(ps->score<60) c+=1; //c表示不及格的学生数数目
}
printf("s=%.3f\n",s); //打印学生成绩的和
ave=s/5; //ave计算学生的平均成绩
printf("average=%.3f\ncount=%d\n",ave,c);
}
int main()
{
struct stu *ps; //定义结构体变量*ps 目的是在内存空间中取一个连续的栈空间,大小是sizeof( struct stu),并将内存的首地址赋值给ps
ps=pupil; //将pupil的地址赋值给ps 将ps的指向定位到具体的结构体数据头处,即给*ps赋值操作,将数据连续写入内存的栈空间中
avg(ps); //将ps赋值,调用函数avg
return 0; //返回mian函数开始执行处
}
结构体指针变量做函数参数的好处:直接减少压栈次数,效率比多次压栈效率高,调用方便。
(2012-03-22,文章来源:http://pda.c114.net/501/a472968.html)