结构体是一种构造数据类型,把不同类型的数据整合在一起,每一个数据都称为该结构体类型的成员。
结构体(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
- #include
- 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语言中,使用“.”运算符来引用结构体变量中的各个成员。
注意:通常结构体类型的定义放在主函数外。