概述
设计程序时,最重要的步骤之一是选择表示数据的方法。在许多情况下,简单变量甚至是数组还不够。为此,C提供了结构变量(structure variable)提高你表示数据的能力,它能让你创造新的形式。
建立结构声明
结构声明(structure declaration)描述了一个结构的组织布局。声明类似下面这样:
struct students
{
char name[20];
int age;
float score;
};
该声明描述了一个由一个字符数组、一个int型变量和一个float型变量组成的结构。该声明并未创建实际的数据对象,只是描述了该对象由什么组成。
关键字sturct表明跟在其后的是一个结构,后面是一个可选的标记,稍后程序中可以使用该标记引用该结构。例如,我们在后面程序中可以这样声明:
struct students stu1;
这里把stu1声明为一个使用students结构布局的变量。
在结构声明中,用一对花括号括起来的是结构成员列表。每个成员都用自己的声明来描述。成员可以是任意一种c的数据类型,甚至可以是其他结构。
定义结构变量
结构体类型在编译时并不为其分配空间,不能对其进行赋值或运算。若想要分配储存空间并参与运算,还必须使用结构体变量。结构体变量也必须遵循先定义在引用的原则。结构体变量定义有三种方法:
(1)先定义结构体类型,在定义变量,类型和变量分开定义。
struct students //定义结构体类型
{
char name[20];
int age;
float score;
};
struct students stu1,stu2; //定义结构体变量stu1和stu2
(2)在定义结构体类型的同时定义变量。
struct students //定义结构体类型
{
char name[20];
int age;
float score;
}stu1,stu2; //定义结构体变量stu1和stu2
(3)不定义类型名,直接定义变量
struct
{
char name[20];
int age;
float score;
}stu1,stu2;
在方法(3)中,struct后没有结构标记,因此这种方法只适用于对变量进行一次定义的情况,不能在别处用它来定义其他该类型的结构体变量。
结构体变量的使用
1、结构体变量的初始化
与其他类型一样,结构体变量也可以在编译时进行初始化。初始化的实质时对其中的各成员变量赋初值,其一般格式如下:
结构体类型名 结构体变量 ={初始值表};
例如,前面已经定义的结构体类型struct students ,可用它定义结构体变量,并对其进行初始化。
main()
{
struct students stu1 = { "张三",18,90.0 };
......
}
简而言之,我们在使用一对括号中括起来的初始化列表进行初始化,各初始化项用逗号分隔。
结构的初始化器
C99和C11为结构提供了指定初始化器。结构的指定初始化器使用点运算符和成员名标识特定的元素。例如只初始化stu2中的age成员,可以这样做:
struct students stu2 = { .age = 18 };
2、访问结构成员
结构体变量的引用和数组一样,只能以分量的方式对结构体变量进行访问。
C语言规定:可以对结构体最低一级别的成员进行引用。对结构体变量进行引用的一般格式如下:
结构体变量名.成员名
其中,“.”是结构体成员运算符,它是所有运算符中优先级最高的运算符,结合性是自左至右。用这种形式就可以按成员类型的变量对结构体成员进行操作。
结构数组
接下来,我们想用struct students结构处理多名学生信息。每名同学信息都可以用一个students类型的结构变量来表示。此时,可以用这一类型的结构数组来处理多名同学信息。
1、声明结构数组
声明结构数组和声明其他类型的数组类似,下面是一个声明结构数组的例子:
struct students stu[20];
以上代码把stu声明为一个含20个元素的数组。数组的每一个元素都是一个students类型的结构。数组名stu本身不是结构名,它是一个数组名,该数组的每个元素都是struct students类型的·结构变量。
2、标识结构数组的成员
为了标识结构数组中的成员,可以采用访问单独结构的规则:在结构名后面加一个点运算符,再在点运算符后面写上成员名。如下所示:
stu[0].age //第一个数组元素与age相关联
stu[5].score //第六个数组元素与score相关联
使用stu[0].age的原因是:stu[0]是结构变量名,正如stu[5]是另一个结构变量名。
最后,让我们用四个例子做区分:
stu //一个students结构的数组
stu[1] //一个数组元素,该元素是students结构
stu[1].name //一个char数组(stu[1]的name成员)
stu[1].name[3] //数组中stu[1]元素的name成员的一个字符
结构指针
1、声明和初始化结构指针
声明结构指针:
struct students *p;
首先是关键字struct,其次是结构标记students,然后是一个“*”,其后跟着指针名。
该声明并未创建一个新的结构,但是指针p可以指向任意现有的students型结构。例如:
p = &stu1;
和数组不同的的是结构变量名并非结构变量的地址,因此要在结构变量名前加上&运算符。
在本例中,stu是一个结构数组,这意味着stu[0]是一个结构名。所以要让p指向stu[0]可以这样写:
p = &stu[0];
2、用指针访问成员
指针p指向结构变量stu[0],通过p获得stu[0]的成员的值有两种方法。
第一种方法:使用->运算符。该运算符由一个链接号(-)后跟一格大于号(>)组成。
如果p = &stu[0],那么p->age即是stu[0].age
换句话说,指向结构后面的->运算符和结构体变量的.运算符工作方式相同(不能写成p.age,因为p不是结构名)。
第二种方法:以顺序指定结构成员的值:
如果p==stu[0],那么*p==stu[0],因此,可以做一下替代
stu[0].age==(*p).age
必须要使用圆括号,因为.运算符优先级比*运算符高。
最后
以上就是从容海燕为你收集整理的结构体基础知识梳理建立结构声明定义结构变量结构体变量的使用结构数组结构指针的全部内容,希望文章能够帮你解决结构体基础知识梳理建立结构声明定义结构变量结构体变量的使用结构数组结构指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复