目录
结构体定义
结构体是一种构造类型数据,结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员
结构体类型的声明
struct 结构体名
{
数据类型 成员名 1;
数据类型 成员名 2;
数据类型 成员名 3;
......
数据类型 成员名 n;
};
struct date {int year,month,day;}; struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; struct date birthday; }
|
1.先声明结构体类型再定义变量名
与定义为基本类型不同之处在于结构体类型不仅要指定变量为结构体类型,而且要指定为某一特定的结构体类型
2.定义结构体类型的同时定义变量
也就是在定义结构体类型时后花括号{}后面直接定义上该结构体类型变量的名字
3.直接调用结构体类型变量
第3种和第2种的区别在于没有给结构体类型命名,也就是structural后面没有结构体类型名
在此定义的无类型名
问题:结构体变量占多少个字节?
不同的结构体类型所含成员不同,因此没有固定的长度。结构体变量所占内存长度是各成员所占的内存长度之和,每个成员分别占用自己的内存单元
结构体变量的引用
形式:结构体变量名.成员名
注:不能将结构体变量作为一个整体进行输入输出
成员本身如果是结构体类型,只能对最低级的成员进行赋值等引用和运算
结构体成员和普通变量一样,可进行各种运算,其中" . "优先级最高,可以引用结构体变量成员的地址,也可以引用结构体变量的地址
结构体变量的地址主要作用用于函数传参,传递结构体变量的地址
例:scanf("%d",&student1.num);
printf("%o",&student1);
但是不能用以下语句整体读入结构体变量
如:scanf("%d,%s,%c,%d,%f",&student1);
结构体变量的赋值
1.定义结构体变量是赋值——初始化
在对结构体变量初始化时需要按照成员表的顺序依次赋初值,各个成员间用逗号隔开。
2.使用赋值语句为结构体变量整体赋值
结构体成员的赋值
(1)使用赋值语句为成员赋值
student.num=101;
(2)使用输入语句为成员赋值
scanf("%s",student1.name);
例:对结构体变量初始化并输出
#include <stdio.h>
struct student//结构体类型声明
{
long num;
char name[20];
char sex;
float score;
} ;
int main()
{
/*声明结构体变量a并赋初值*/
struct student a={1011,"ZhangSan",'N',90};
/*输出结构体变量a的各项成员值*/
printf(" No:%Id\n name:%s\n sex:%c\n score:%f\n",a.num,a.name ,a.sex,a.score);
}
实验结果如下:
注:结构体变量之间除了允许相互赋值外,不允许对结构体变量进行整体操作(输入、输出或运算等),只能对其成员进行操作。
结构体数组
1.结构体数组的定义
(1)先声明结构体类型再定义结构体数组
例:struct student stu[3];
(2)定义结构体类型的同时定义结构体数组
(3)直接定义数据类型数组
2.结构体数组的初始化
一般形式:在定义数组的后面加“={初值列表};”
例:
struct student
{
...
} stu[3]={ {...},{...},{...} };
3.结构体数组的引用
引用形式:
结构体数组名[元素下标].结构体成员名
例:stu[0].age=20
例:候选人得票统计程序
#include <stdio.h>
#include <string.h>
struct person
{
char name[20];
int count;
}leader[3]={" Zhou ",0," Wu ",0," Zheng ",0};
main(){
int i,j;
char leader_name[20];
for(i=1;i<=10;i++)
{
scanf("%s",leader_name);
for(j=0;j<3;j++)
if(strcmp(leader_name,leader[j].name)==0)
leader[j].count++;
}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
实验结果如下: