16

c语言入门14,如何用C语言描述一只猫?C语言的结构体介绍

 4 years ago
source link: https://blog.popkx.com/introduction-to-c-language-14-how-to-describe-a-cat-in-c-language-introduction-of-structure/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

还记得刚开始接触 C 语言的时候,为了描述一个平行四边形的边长和对角线长,我定义了四个变量:短边长 a,长边长 b,对角线1长 d1,对角线2长 d2。在写代码的过程中,发现又要定义一个平行四边形,于是我不得不又定义了四个变量:a2,b2,d12,d22,结果变量又多又乱,写代码很不舒服,太容易弄混了。当时我还想,幸好没有第三个,第四个平行四边形。

1a36966218f89b018ac22d095aff7eda.png

后来,我发现原来 C 语言原来可以定义复合数据类型,不禁感叹当初我那种做法实在是太笨了。

C 语言中的结构体(复合数据类型)

到目前为止,前面 13 节使用的大多数数据类型都具有单一的值,我们用到了整数,字符,真假值,小数,在 C 语言中(或者说编程语言中)这些数据类型通常被称作基本数据类型

那什么是复合数据类型呢?实际上,你已经用过复合数据类型了——由许多字符组成的字符串,就是典型的符合数据类型。看出来没?复合数据类型,其实就是由基本类型组成的数据类型。

7a2bf99b7184ff647c37d2f5dfe965b8.png

本节打算介绍的结构体也是一种复合数据类型,我们不讨论结构体的定义,直接看实例:

用 C 语言制定一个描述平行四边形边长和对角线长的结构体数据类型。

这个需求是容易实现的,我们用 double 类型来描述“长度”,那么结构体可以如下定义:

struct parallelogram{
    double a, b, d1, d2;
};
// 或者也可以写成
struct parallelogram{
    double a;
    double b;
    double d1;
    double d2;
};

要注意的是,结构体定义完后,大括号后面要用 “;”结束。parallelogram 并不表示一个变量,它表示一种复合数据类型,struct parallelogram{ double a, b, d1, d2; } 整体可以看做一个就像 int,double 一样的数据类型。那怎么使用它呢?请看下面的实例:

struct parallelogram{
    double a, b, d1, d2;
}p1, p2;
781b25194d3348a0e4a0af40be4293e3.png

这样我们就定义好了 p1 和 p2 两个结构体变量。事实上,定义好结构体 数据类型之后,可以只使用 struct parallelogram 来定义变量,请看:
struct parallelogram{
    double a, b, d1, d2;
};
struct parallelogram p3, p4;

这样定义的 p3 和 p4 与上面那种方式定义的 p1 和 p2 是一样的。如果采用上面那种定义方式,parallelogram 也可以不写:

struct{
    double a, b, d1, d2;
}p1, p2;

但是这样就没有办法再引用这个结构体类型了,因为它没有名字。

定义好变量后,就可以用“.”运算符来访问结构体的各个成员了。例如:

p1.a = 2;
p1.d1 = 3;
p2.b = 5;
p2.d2 = 7;
7df5da4809835689c3a85db00da77342.png

很明显,用结构体来描述平行四边形的边长问题,比定义多个 double 变量方便多了。只需要用 struct parallelogram 定义一个变量,这个变量自己内部就有平行四边形的短边长,长边长,对角线1长和对角线2长了,而且不会弄混,p1 和 p2 的成员彼此是隔离的,使用 "p1."访问的变量肯定是 p1 的。这样一来,要定义再多的平行四边形都不怕了。

C 语言结构体的初始化

我们使用基础数据类型时,初始化很方便,直接赋值就可以了,结构体怎么初始化呢?请看:

double x = 3.0;
struct parallelogram p1 = {x, 4.0, 5.0, 5.0}; // p1.a = 3.0, p1.b=4.0, p1.d1=5.0, p1.d2=5.0
struct parallelogram p2 = {3.0, }; // p2.a = 3.0, p2.b=0.0, p2.d1=0.0, p2.d2=0.0
struct parallelogram p3 = {}; // p3.a = 0.0, p3.b=0.0, p3.d1=0.0, p3.d2=0.0

这几种方式都是可以的,只不过要是使用第一种方式定义,p1 必须是局部变量。p1 若是全局变量,就只能用常数表达式定义了。另外需要特别注意的是,一旦变量定义好了,就不能直接用下面种方式赋值了,但是同类型之间可以赋值:

struct parallelogram p1;
struct parallelogram p2 = {3.0, }; 
p1 = {3.0, 4.0, 5.0, 5.0};          // 非法

p1 = p2;        //合法
3a639e957b7300714c0aabfe74f1944a.png

我们用一个完整的例子结束本节:
#include <stdio.h>

int main()
{
    struct parallelogram{
        double a, b, d1, d2;
    } p;
    double a = 3.0;
    p.a = 3.0;
    p.b = 4.0;
    p.d1 = 5.0;
    p.d2 = 5.0;

    printf("d1 of parallelogram is: %f\n", p.d1);
    return 0;
}
0ca970858a419b68cf0b18864de54cac.png

注意,上面定义的变量 a 与 结构体里的 a 并不冲突,因为结构体里的 a 是用过“.”运算符访问的,编译器可以区分,它们属于不同的命名空间。

好了,学会了C语言的结构体,就算是要描述一只猫,也不怕了。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK