C语言基础

    返回首页    发表留言
本文作者:李德强
          第一节 结构体
 
 

一、结构体

        今天我们来一起学习C语言中另一个重要的机制——结构体,所谓结构体就是把一些普通变量按照一定的格式组成一个全新的变量类型,从而为其它程序所使用。而使用这个新变量类型与普通变量类型的方法 一样。定义结构体很简单,我们只需要为其指定一个名称,并在其中定义这个结构体所需要使用的属性即可。

定义结构体格式

struct 结构体名称

{

    自定义内容格式

};

 

        定义结构体类型的变量:

struct 结构体名称 变量名;

        使用结构体变量的属性:

变量名.属性 = 值;

        下面我们来举一个例子看看结构体的定义与使用。我们知道平面上点的是由其在x轴上的坐标和y轴上的坐标而确定的,所以我们在程序中想要描述平面上的一个点,就需要定义这个点的两个属性变量x和y,例如:

 

float point0_x = 1;
float point0_y = 3;
float point1_x = 2;
float point1_y = 4;

        而对于这样的坐标点,一个点相关的变量中x和y始终是成对出现的,也就是说:对于平面内点的坐标,一定是有两个属性,x和y。于是我们就可以将这个两个属性(两个变量)定义成一个结构体,名字就叫作平面内点的坐标变量,简称点:

struct point
{
    float x;
    float y;
};

        这样我们就有了一个叫作“点类型”的变量类型,它表示:只要定义了这种变量类型,这个类型的变量就会有两个属性(x和y)。接下来我们就可以使用这种类型来定义两个点p0和p1,

struct point p0;
struct point p1;
p0.x = 1;
p0.y = 2;
p1.x = 3;
p1.y = 1;

二、结构体嵌套

        上面我们定义了平面上的两个点的坐标,接下来我们就有了平面上两个点的坐标,有了点,我们就可以根据点的结构再定义一种新的变量类型,叫作矩形:struct rect。

我们来定义一个矩形的结构体,这个矩形结构体中嵌套了点结构体,而使用时与正常结构体使用一致。先来看看这个例子,并编写一个函数用于计算矩形的面积面积:

#include <stdio.h>
#include <math.h>
struct point
{
    float x;
    float y;
};
struct rect
{
    struct point p0;
    struct point p1;
};
float area_of_rect(struct rect r)
{
    return fabs(r.p1.x - r.p0.x) * fabs(r.p1.y - r.p0.y);
}
int main(int argc, char *argv[])
{
    struct rect r;
    r.p0.x = 1;
    r.p0.y = 2;
    r.p1.x = 3;
    r.p1.y = 1;
    printf("%f\n", area_of_rect(r));
    return 0;
}

 

三、简化定义

        当然,在这里我们定义的结构体变量,并将其做为了一个函数的输入参数。关于结构体做为函数参数和函数返回值的问题,我们将在下一节中学习。另外,我们在定义结构体时,也可以直接在定义之后定义这个结构体类型的变量:

typedef struct student
{
    int id;
    int age;
    char name[10];
} zhangs,lis,wangw;

        这样就定义了一个叫学生的结构体类型,并在其后直接定义空虚这个学生类型的3个变量,zhangs,lis,wangw。

        另外,我们在使用结构体变量时,总是要使用struct name var这样的形式,多多少少有一些麻烦。为了使程序更加简洁,我们可以使用typedef关键字来来对这个结构体类型重新定义。例如:

typedef struct student
{
    int id;
    int age;
    char name[10];
} stu;
stu s0;
stu s1;
stu s2;

        这样就定义了一种结构体叫struct student,而通过typedef将其重新定义为stu类型,之后我们就可以 通过stu来定义这种结构体类型变量。在程序中使用stu就表示struct stuent,这样表示就简单很多,但是请注意:如果使用了typedef结构体定义中大括号结构后的名称就是这个结构体的新名字,而如果不使用typedef结构体定义中的大括号结束后面的文字表示定义的是这个结构体的变量。

 

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号