c语言 结构体_C语言快速入门——引入结构体

事实上,基于我们目前已经掌握的基础数据类型,已经完全可以做一些小程序了。但想像一下,用一把苹果去皮刀去切大西瓜会是什么感受。因此我们将继续学习C语言中更好的工具,以方便我们未来更好的驾驭程序。

966e9f718bbe2bb3df442b0381f85f6f.png

先让我们尝试用程序设计语言来描述一下猫的特性。一只猫可以有自己的名字、年龄、体重、花色...

char  catName[64];  // 用一个字符数组存储猫的名字int   catAge;       // 用一个整型存储年龄float catWeight;    // 用一个浮点九存储体重int   catColor;     // 用一个整型存储花色

可是我有一个秘密要告诉你,我养了两只猫,你能把它们都描述一下么?不假思索,我们可以这么做……

char  cat1Name[64];int   cat1Age;float cat1Weight;int   cat1Color;char  cat2Name[64];  int   cat2Age;   float cat2Weight;    int   cat2Color;    

我想这么写下来,你自己的心里都过意不去了,如果是三只猫呢?或许数组是更好的方式。

char  catName[64];      // 这里该怎么办呢?int   catAge[2];        // 这些数组存储两只猫的年龄等信息float catWeight[2];int   catColor[2];

由于我们没有学习多维数组,你可能会在catName处犯难,它的对应定义是catName[2][64]。现在不要计较这里的定义,只需要知道它可以保存两只猫的名字即可。看起来数组版本的方案还是不错的,我们甚至可以很容易的使用一个循环来输出猫的信息了。

for ( int i = 0; i < 2; i++ ){    printf( "%s %d %.2f %d", catName[i], catAge[i], catWeight[i], catColor[i] )}

也许你有更多的关于猫的主意。比如说,把输出小猫的信息作为一个单独的函数,以达到复用的目的。

void printCat( char *name, int age, float weight, int color ){}

假定猫还定义有更多的特性,比如说品种,喜好等。这时函数参数列表会持续增长,同时你会发现,这些参数虽然都是关于猫的,但却是分离的。如果有一个方法可以完整的描述一只猫,这将是一件幸运的事。同样幸运的是,在C语言中,我们可以使用结构体来把相关的数据组织成一个整体,继而形成一种新的数据类型。由于结构体内部的数据由我们自己组织,结构体类型也被称为自定义数据类型。定义一个结构的语法如下:

struct 类型名{    成员表列};

现在让我们用struct来定义一种新的数据类型Cat,用来描述猫的特性。

// 用struct关键字定义一个新的数据类型Catstruct Cat{    char  name[64];    int   age;    float weight;    int   color;};

结构体一个优秀的特性,就是允许我们把一个事物相关的特性集中在一起。留意一下Cat类型中成员的命名,如name,而非catName。我们去掉了前缀cat,因为这个name已经属于Cat类型了,所以没有必要再次指定。

我们一再强调struct定义的是一种新类型,与C语言内置类型相似,我们也可以定义这一类型的变量。不同的是,关键字struct现在是类型定义的一部分。

// 定义Cat类型变量cat1、cat2// 注意类型前需要关键字structstruct Cat cat1;   struct Cat cat2;

为了便于循环处理,我们也可以定义Cat类型的数组,如

struct Cat cats[2]; // 可以存储两只猫的特性了

再来看看函数方面,函数声明或定义的参数,struct关键字也不可缺失。

void printfCat( struct Cat cat ){    printf( "meow..." );}

使用结构体变量,函数的参数精简了。更深层次的一面,就是那些分散的变量完全被一个cat变量所代替,程序变得更加容易组织。你可能迫不及待的想要在printCat函数中打印猫的信息了!我们先让它“喵”了一声...等等,名字与年龄该怎么访问呢?