C语言回顾-结构体
结构体是我们要学的第二个数据结构,第一个是数组,他和数组有一些区别,也有一些相似。最大的不同是结构体的元素可能具有不同的数据类型,而且每个结构体成员都有名字,所以为了选择特定的结构成员需要指明结构体成员的名字而不是位置。
-
结构体变量的声明
当需要储存相关数据项的集合时,结构是一种合乎逻辑的选择。例如当我们需要记录仓库内的零件时,我们需要记录零件的编号(整型),零件的名称(字符串),还有零件的长度(浮点型)。那么这样的一个结构体应当这样定义;
struct lingjian{//struct就是结构体的类型标示符,lingjian是结构体的名字 int number;//结构体的成员和类型 char name[]; double long; }part1,part2;
这就是一个具有三个成员的结构体,这个时候,struct lingjian就是一种我们设计的数据结构,使用方法和int相似,当我们想要一个这样的数据时,就要struct lingjian P,这个就是一个具有这种结构的数据。每个由struct lingjian定义的结构体都有相同的成员
-
结构体变量的初始化
和数组一样,结构变量也可以在声明的同时进行初始化。为了对结构体进行初始化,要把待出储存到结构体中的值先存放到花括号内。比如我们先定义一个P零件;
这样p就是一个编号为100,长度为123.456,名字为“零件”的结构体。。而这里需要注意,struct后面的名字如果丢失,就成为无名结构体,这样的结构体只能在定义的时候初始化,所以如果初始化的时候没有定义结构体,那么无名结构体是没有意义的。
除此之外,我们还可以使用指定初始化,对结构体内的某一个成员进行初始化。这里我们要介绍点号.,我们将点号和成员名称的组合称为标指示符。比如我们要初始化另一个P:
当我们打出一个点号,编译器会自动显示成员。那么我们来编程实现上面哪个操作:
#include<stdio.h> #include<string.h> struct lingjian { int num; double number; char name[20]; }; int main() { struct lingjian p;//这里我们定义一个结构体p p.num = 100; p.number = 123.456; strcpy(p.name, "lingjian");//字符串比较特殊,不能同赋值号赋值,这里是string.h里的专门用来复制字符串的函数,它的作用就是把第二个字符串复制到第一个字符串里 printf("num=%d\nnumber=%lf\nname=%s", p.num, p.number, p.name);//这里我们打印出结果看看 getchar(); return 0; }
当然结果是这样的:
这里我们使用了strcpy函数,因为字符串不能用赋值号赋值,它包含在string.h这个头文件里,作用是把第二个字符串复制给第一个,这个头文件里还有很多专门针对字符串的函数,比如strlen(计算长度),strcmp(比较两个字符串),strcat(把第二个字符串连接到第一个后面),后面再仔细介绍,今天先重点理解结构体的指定初始化。
-
对结构体的操作
既然数组最常用的操作是去下标,那么结构体主要的操作方式就是句点,但是我们还有一种操作方法,就是指针。结构体指针也是很重要的一种数据结构,它的具体操作主要就是点号,它也是一种运算符,并且它的优先级高于&和*,所以它的优先级几乎高于所有其他运算符。
这里我们再介绍一个技巧,关于typedef的使用,很容易理解,结构体的定义一般很长,所有我们需要typedef来为数据类型起一个别名,就好像是另一个名字,效果是一样的,像这样
typedef struict stu
{
char name[20];
int num;
double number;
}S;
这个时候,S就是struct stu,两个的使用是等价的,可以简略一部分代码量。关于结构体数组也不再多介绍了,和其他数组的操作都一样,结构体很灵活,里面可以包含很多数据结构,可以产生很神奇的效果,就比如,大家可以思考一下,如果一个结构体含有另一个结构会是怎么样的呢?这个我们以后再做介绍。
21 : 53