C语言结构体变量的定义和使用(非常详细,附带实例)
之前学习 C 语言,大家接触到的数据类型大部分都是基本数据类型,如整型、字符型等,也介绍了数组这种构造类型,数组中的各元素属于同一种类型。
但是在一些情况下,这些基本数据类型是不能满足要求的。此时,程序员可以将一些有关的变量组织起来定义成一个结构(structure),以表示一个有机的整体或一种新的类型,程序就可以像处理内部的基本数据那样对结构进行各种操作。
既然结构体是一种新的类型,就需要先对其进行构造,这里称这种操作为声明结构体。声明结构体的过程就好比生产商品的过程,只有商品生产出来才可以使用该商品。
假如在程序中要使用“水果”这样一种类型,一般的水果具有名称、颜色、价格和产地等信息,如下图所示。

图 1 “水果”类型
从图 1 可知,“水果”这种类型并不能使用之前学习过的任何一种类型来表示,这时就要自定义一种新的类型,将这种自己指定的结构称为结构体。
声明结构体时使用的关键字是 struct,其一般形式如下:
例如,声明图 1 所示的结构体,代码如下:
声明一个结构体表示的是创建一种新的类型名,要用新的类型名定义变量。定义的方式有以下几种。
“结构体成员列表 1、结构体成员列表 2……、结构体成员列表 n”是用户自定义的标识符。每个“结构体成员列表”都可以包含多个同类型的成员,它们之间用“,”隔开。

图 2 定义结构体变量
为了使规模较大的程序更便于修改和使用,常常会将结构体类型的声明放在一个头文件中,这样在其他源文件中如果需要使用该结构体类型,则可以用 #include 命令将该头文件包含到源文件中。
对一般形式的说明如下:
例如,声明 struct Fruit 结构体的同时定义变量,代码如下:
例如:
对结构体变量进行赋值、存取或运算,实质上就是对结构体成员进行操作。引用结构体成员的一般形式如下:
注意,不能直接将一个结构体变量作为一个整体进行输入和输出。例如,不能将 fruit 进行以下输出,代码如下:
但是在一些情况下,这些基本数据类型是不能满足要求的。此时,程序员可以将一些有关的变量组织起来定义成一个结构(structure),以表示一个有机的整体或一种新的类型,程序就可以像处理内部的基本数据那样对结构进行各种操作。
结构体类型的概念
结构体是一种构造类型,它是由若干“成员”组成的,其中的每一个成员可以是基本数据类型也可以是构造类型。既然结构体是一种新的类型,就需要先对其进行构造,这里称这种操作为声明结构体。声明结构体的过程就好比生产商品的过程,只有商品生产出来才可以使用该商品。
假如在程序中要使用“水果”这样一种类型,一般的水果具有名称、颜色、价格和产地等信息,如下图所示。

图 1 “水果”类型
从图 1 可知,“水果”这种类型并不能使用之前学习过的任何一种类型来表示,这时就要自定义一种新的类型,将这种自己指定的结构称为结构体。
声明结构体时使用的关键字是 struct,其一般形式如下:
struct 结构体名 { 成员列表 };关键字 struct 表示声明结构体,其后的结构体名表示该结构的类型名。花括号中的变量构成结构的成员,也就是一般形式中的成员列表。
注意,在声明结构体时,要注意花括号最后有一个分号“;”,在编程时千万不要忘记。
例如,声明图 1 所示的结构体,代码如下:
struct Fruit { char cName[10]; /*名称*/ char cColor[10]; /*颜色*/ int iPrice; /*价格*/ char cArea[20]; /*产地*/ };上面的代码使用关键字 struct 声明一个名为 Fruit 的结构体,在结构体中定义的变量是 Fruit 结构体的成员,这些变量分别表示名称、颜色、价格和产地,可以根据成员结构不同的作用选择与其相对应的类型。
C语言结构体变量的定义
前面介绍了如何使用 struct 关键字来构造一个新的结构类型以满足程序的设计要求。使用构造出来的类型才是构造新类型的目的。声明一个结构体表示的是创建一种新的类型名,要用新的类型名定义变量。定义的方式有以下几种。
1) 先声明结构体类型,再定义变量
这种方式的一般形式如下:struct 结构体名 { 成员列表; }; //定义结构体类型 struct 结构体名 变量名; //定义结构体变量这里值得说明的内容有很多,我们对一般形式从上往下介绍:
- struct 是声明结构体使用的关键字。
- 结构体名是用户自定义的标识符。结构体名是这个结构体类型的名字。
- “成员列表”包含“数据类型1、数据类型2……数据类型n”,不仅可以是基本数据类型(整型、浮点型等),还可以是构造数据类型(数组、指针等)。
“结构体成员列表 1、结构体成员列表 2……、结构体成员列表 n”是用户自定义的标识符。每个“结构体成员列表”都可以包含多个同类型的成员,它们之间用“,”隔开。
例如,前面声明了 Fruit 结构体类型,用 struct Fruit 定义结构体变量,如下图所示。注意,在同一个结构体声明中,不能有相同名字的变量,但在不同结构体声明中成员可以同名,并且结构体成员可以和程序中的其他变量同名。

图 2 定义结构体变量
为了使规模较大的程序更便于修改和使用,常常会将结构体类型的声明放在一个头文件中,这样在其他源文件中如果需要使用该结构体类型,则可以用 #include 命令将该头文件包含到源文件中。
2) 在声明结构体类型的同时定义变量
这种定义变量的方式的一般形式如下:struct 结构体名 { 成员列表; }变量名列表 ;可以看到,在一般形式中将定义的变量的名称放在声明结构体的末尾处。但需要注意的是,变量的名称要放在最后的分号的前面。
对一般形式的说明如下:
- 成员列表是结构体成员的列表;
- 变量名列表是定义的一系列变量名,每个变量名都是合法的标识符,每两个变量名用“,”隔开。
例如,声明 struct Fruit 结构体的同时定义变量,代码如下:
struct Fruit { char cName[10]; /*名称*/ char cColor[10]; /*颜色*/ int iPrice; /*价格*/ char cArea[20]; /*产地*/ }fruit1; /*定义结构体变量*/定义的变量不是只能有一个,可以定义多个变量。
3) 直接定义结构体变量
其一般形式如下:struct { 成员列表 }变量名列表;从上述代码可以看出这种方式没有给出结构体名称,如定义图 1 中“水果”类型的变量 fruit,代码如下:
struct { char cName[10]; /*名称*/ char cColor[10]; /*颜色*/ int iPrice; /*价格*/ char cArea[20]; /*产地*/ }fruit; /*定义结构体变量*/
4) 使用typedef说明结构体类型名,再用新类型名定义变量
使用 typedef 这种定义方式的一般形式如下:typedef struct { 成员定义表; }新类型; 新类型 变量名表;
例如:
typedef struct { char cName[10]; /*名称*/ char cColor[10]; /*颜色*/ int iPrice; /*价格*/ char cArea[20]; /*产地*/ } Fruit; Fruit fruit1;
C语言结构体类型的初始化
结构体类型与其他基本数据类型一样,也可以在定义结构体变量时指定初值,例如:struct People { char cName[20]; char cSex; int iGrade; }student1={"HanXue",'W',3}; /*定义变量并设置初值*/注意,在初始化时,定义的变量后面要使用等号,然后将其初始化的值放在花括号中,并且每一个数据要与结构体的成员列表的顺序一一对应。
C语言结构体变量的引用
定义完结构体变量以后,当然可以引用这个变量。例如水果,既然生产出水果,就可用它做点儿什么,以充分体现水果的价值。对结构体变量进行赋值、存取或运算,实质上就是对结构体成员进行操作。引用结构体成员的一般形式如下:
结构体变量名.成员名在引用结构体成员时,可以在结构体变量名的后面加上成员运算符“.”和成员名,例如:
fruit.cName="apple"; fruit.iPrice=5;上面的赋值语句就是对 fruit 结构体变量中的成员 cName 和 iPrice 进行赋值。
注意,不能直接将一个结构体变量作为一个整体进行输入和输出。例如,不能将 fruit 进行以下输出,代码如下:
printf("%s%s%s%d%s",fruit);利用结构体输出 vivo NEX 的基本信息。具体代码如下:
#include<stdio.h> struct telephone //声明手机基本信息结构体 { char brandName[20]; //产品名称 int price; //官方报价 char screen[20]; //屏幕类型 char processor[20]; //CPU型号 int battery; //电池容量 }telephone1 = { "vivo NEX",4998,"双面屏","高通 骁龙845",4000}; //定义变量并设置初值 int main() { //将结构体中的第1个数据输出,即产品名称 printf("产品名称:%s\n", telephone1.brandName); //将结构体中的第2个数据输出,即官方报价 printf("官方报价:%d元\n", telephone1.price); //将结构体中的第3个数据输出,即屏幕类型 printf("屏幕类型:%s\n", telephone1.screen); //将结构体中的第4个数据输出,即CPU型号 printf("CPU型号:%s\n", telephone1.processor); //将结构体中的第5个数据输出,即电池容量 printf("电池容量:%dmAh\n", telephone1.battery); return 0; }运行程序,结果如下图所示:
产品名称:vivo NEX
官方报价:4998元
屏幕类型:双面屏
CPU型号:高通 骁龙845
电池容量:4000mAh