1.结构体定义:
C语言允许用户自己建立不同类型数据组成的组合成的数据结构,它们被称为结构体,在其他语言中称为”记录“(record)
struct 结构体名
{ 成员表列 }; //成员列表:类型名 成员名;
//例
struct Date{
int month;
int day;
int year;
}
2.定义定义结构体类型变量
1.先声明结构体类型,再定义该类型变量
// 结构体类型名 结构体变量名
struct Student student1,student2;
2.在声明类型的同时定义变量
struct 结构体名
{
成员表列
}变量名表列;
3.不指定类型名而直接定义结构体类型变量
struct
{
成员表列
}类型表列;
说明:
(1)结构体类型与结构体变量是不同的概念。只能对变量赋值,存取或运算,而不能对一个类型赋值、存取或者运算。在编译时,对类型是不分配空间,只对变量分配空间
(2)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一个对象。
(3)对结构体变量中的成员(即”域“)可以单独使用,它的作用与地位相当于普通变量
3.结构体初始化与引用
#include<stdio.h>
int main()
{
struct Student //声明结构体类型 struct Student
{
long int num;
char name[20];
char sex;
}a={10010,"linLi","M"}; //定义结构体变量a,并初始化
printf("NO: %ld\nname:%s\nsex:%c",a.num,a.name,a.sex);
return 0;
}
(2)可以引用结构体变量中成员的值
结构体变量名.成员名
例
student1.num=10010;
student1.num(结构体变量student1中成员变量num);
(3)结构体包含结构体成员
//在结构体struct student类型的成员包含另一个结构体struct date类型的成员birthday
student1.birthday.month(结构体变量student1中成员birthday中成员month)
// 不能用student1.birthday来访问student1变量中成员的birthday,因为birth本身是个结构体
(4)对结构体变量的成员可以像普通变量一样进行各种运算
student2.score=student1.score; //赋值运算
student2.num=student1.num+1; //加法运算
student1.age++; //自增运算
(5)同类型的结构体变量可以相互赋值
student1=student2;
(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址
scanf("%d",&student1.num);
printf("%o",&student1);
scanf("%d,%s,%c",&student1); // 错误,不能整体读入结构体变量
4.使用结构体数组
//(1)定义结构体数组一般形式
struct 结构体名
{
成员表列
}数组名[数组长度];
//(2)先声明一个结构体类型(struct Person),然后再定义结构体数组
struct Person leader[3]; //leader是结构体数组名
//初始化结构体数组
struct Person leader[3]={"Li",0,"zhang"}
5.指向结构体变量的指针
//所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。
//如果把一个结构体变量的起始地址存放在一个指针变量中,这个指针变量就指向该结构体变量
struct Student *pt;
指向结构体对象的指针变量既可以指向结构体变量,也可以指向结构体数组中的元素指针变量的基类型必须与结构体变量的类型相同。
6.指向结构体数组指针
p=stu;
7.用结构体变量和结构体变量的指针作函数参数
将一个结构体变量的值传递给另一个函数
(1)用结构体变量的成员作参数(stu[1].num)
(2)用结构体变量作实参(不使用,时间,内存占用大)
(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量的地址传给形参
void(struct Student stu[]);