结构体是一种构造数据类型,把不同类型的数据整合在一起,每一个数据都称为该结构体类型的成员。
结构体(struct)数据类型可以把基本数据类型和派生类组合起来,以描述复杂的事物。结构类型也是派生类型。
基本数据类型都是单一的,只能表示一些简单的事物。
结构体类型定义:
在程序设计中,使用结构体类型时,首先要对结构体类型的组成进行描述,定义方式:
struct 结构体类型名称
{数据类型 成员1;数据类型 成员2;...数据类型 成员n;
}
结构体变量的定义:为了能在程序中使用结构体类型的数据,应该定义结构体类型的变量,并在其中存放具体的数据。
struct [结构类型名] {成员声明列表} [变量名列名];
1、先定义结构体类型,再定义结构体变量;
struct coord
{int x;int y;
} ;
2、在定义结构体类型的同时定义结构体变量;
struct coord
{int x;int y;
} first , secord;
3、直接定义结构体变量(不建议)
struct
{int x;int y;
} first , secord;
结构体类型时用户自定义的一种数据类型,在编译时对结构体类型不分配空间,只有用它来定义某个变量时,才会为该结构体变量分配结构体类型所需大小的内存单元。
结构体变量的内存分配:结构体变量占据的内存大小是按照字节对齐的机制来分配的。通常情况下,字节对齐满足两个原则。
1、结构体的每个成员变量相当于结构体首地址的偏移量,是该成员变量的基本数据类型(不包括结构体、数组等)大小的整数倍,如果不够,编译器会在成员之间加上填充字节。
2、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果不够,编译器会在最末一个成员之后加上填充字节。
程序演示:
struct Sample
{short int n;char c[11]; float f;double b;
}s;int main(void)
{printf("变量s所占字节数为:%d个字节\n",sizeof(s)); printf("结构成员 地址\n");printf(" n %X\n",&s.n) ;printf(" c %X\n", s.c) ;printf(" f %X\n",&s.f) ;printf(" n %X\n",&s.b) ;return 0;
}
例题1:计算两点之间的距离
#include<stdio.h>
#include<math.h>
struct coord //结构类型定义
{int x;int y;
};int main(void)
{struct coord first,second; //结构变量声明double distance;printf("请输入第一个点坐标:");scanf("%d %d",&first.x,&first.y); //点运算符访问结构成员printf("请输入第二个点坐标:"); scanf("%d %d",&second.x,&second.y);int xDiff = first.x-first.x; //横坐标的差 int yDiff = second.x-second.y; //纵坐标的差 distance = sqrt(pow(xDiff,2)+pow(yDiff,2));printf("两点间距离是:%f\n",distance);return 0;
}
通过点运算符访问结构成员:结构变量实际上是结构中多个成员变量的组合。在C语言中,使用“.”运算符来引用结构体变量中的各个成员。
注意:通常结构体类型的定义放在主函数外。