首页 > 编程笔记 > C语言笔记 阅读:5

C语言结构体变量的定义和使用(非常详细,附带实例)

之前学习 C 语言,大家接触到的数据类型大部分都是基本数据类型,如整型、字符型等,也介绍了数组这种构造类型,数组中的各元素属于同一种类型。

但是在一些情况下,这些基本数据类型是不能满足要求的。此时,程序员可以将一些有关的变量组织起来定义成一个结构(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 结构体名 变量名;     //定义结构体变量
这里值得说明的内容有很多,我们对一般形式从上往下介绍:
“结构体成员列表 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

相关文章