赞
踩
在C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型)。本文主要介绍关于结构体以下几部分。
在实际的应用中,往往变量的类型复杂多变,我们仅仅使用C语言内置的类型无法准确的去定义变量,所以引出了结构体这个概念。也就是说,为了描述复杂类型的个体,只用C语言基础的内置类型不能完整的表述,而结构体就可以很好的解决这个问题。
结构体本质上还是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。
如何定义一个结构体,一般定义的形式如下所示:
//结构体的定义
struct + 结构体名称
{
成员列表;
};
【注】在定义结构体的时候,大括号最后一定不要忘记分号:‘;’
我们举个简单的例子:我们定义一个名为Student的结构体,该结构体的成员包括:姓名,学号,性别,年龄,总成绩等。
//struct是一个
struct Student //定义一个名为Student的结构体
{
char name[20]; //姓名
int id; //学号
char sex; //性别(1:男 0:女)
int age; //年龄
int score; //总成绩
};
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。在上面的例子中,Student为结构体名,它包含了5个成员,分别是:name,id,sex,age,score。特别注意,结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。
既然结构体是一种数据类型,那它就像C语言基础的内置类型一样,可以去定义变量,下面就举个简单的例子:
(1)结构体变量的定义可以放在结构体的声明之后:
struct Student //定义一个名为Student的结构体
{
char name[20]; //姓名
int id; //学号
char sex; //性别(1:男 0:女)
int age; //年龄
int score; //总成绩
};
struct Student stu; //定义一个结构体变量
(2)结构体变量的定义也可以在结构体声明的同时定义,这样就简化了代码:
struct Student //定义一个名为Student的结构体
{
char name[20]; //姓名
int id; //学号
char sex; //性别(1:男 0:女)
int age; //年龄
int score; //总成绩
}stu; //在结构体声明的同时定义一个结构体变量stu
在实际的定义中,往往使用第二种方法
struct Student stu1; //C语言中,利用结构体去定义变量的时候,必须加上struct,不能省略
Student stu2; //C++中,利用结构体去定义变量的时候,可以省略struct,可直接使用结构体名去定义
(3)还可以使用匿名结构体来定义结构体变量
struct //没有结构体名
{
char name[20]; //姓名
int id; //学号
char sex; //性别(1:男 0:女)
int age; //年龄
int score; //总成绩
}stu; //使用匿名结构体来定义一个结构体变量stu
但要注意的是这样的方式虽然简单,但不能再次定义新的结构体变量了,也就是说,这种定义方式只能定义一次,不能重新再去定义别的变量。在使用的时候,要尤其注意。
虽然结构类似一个数组,只是数组元素的数据类型是相同的,而结构中元素的数据类型是可以不同的。但结构不能像数组那样使用下标去访问其中的各个元素,而应该用结构成员运算符点(.)。即访问成员的一般形式是:
结构体变量名.成员名
举个简单的例子:
struct Student stu; //定义一个结构体变量stu
stu.name; //通过stu.去访问结构体中的成员name,表示学生stu的姓名name
stu.age; //通过stu.去访问结构体中的成员age,表示学生stu的年龄age
我们可以通过运算符(.)去访问结构体成员,例如:
当我们使用结构体变量去访问成员的时候,输入运算符.其后面就会出现结构体成员列表,我们选择要访问的成员即可。这也说明我们定义的结构体变量是正确的。
接上面结构体Student的例子,这里我们对其结构体变量stu1初始化:
struct Student stu1 = { “张飞”, 001, 1, 20, 400 }; //姓名:张飞,学号:001,性别:男(1表示男,0表示女),年龄:20,总成绩:400
struct Student stu1; //若不给结构体初始值,则里面的值均为【随机值】
struct Student stu2 = { "Feizhang" }; //若给结构体只赋值一部分,则后面的全部赋为0
struct Student* stup = &stu1; //定义一个结构体类型的指针stup,指向stu1
struct Student* stuq; //理论上stuq为随机值,但在这里指向0Xcccccccc(Debug模式下会优化为cccccccc)
struct Student Stu_arr[10]; //定义一个结构体数组,若不给初始值,则为随机值
结构体普通变量如何访问其成员:C语言规定,结构体的普通成员可以通过运算符“点.”去访问其成员,例如:
struct Student stu1 = { "Bulv", 20, 1001, 1, 90 }; //定义结构体变量stu1并初始化
struct Student stu2 = { "Feizhang", 22, 1002, 1, 95 }; //定义结构体变量stu2并初始化
stu1.id = 1003; //通过结构体变量stu1去访问成员id,并将其值修改为1003
printf("%s\n", stu1.name); //打印学生stu1的姓名
printf("%d\n", stu1.age); //打印学生stu1的年龄
strcpy_s(stu1.name, 10, "caopi"); //修改stu1的第一个变量name的值(char类型不能直接赋值)
结构体的指针变量如何访问其成员:可以通过箭头符号的方式去访问其成员:
(*p).name == p -> name //左右两种访问方式等价
举个简单的例子:
struct Student stu = { "刘备", 20, 1001, 1, 90 }; //定义结构体变量stu1并初始化
struct Student *p = &stu; //定义一个结构体指针p去指向结构体变量stu
(*p).age = 23; //等价于p -> age = 23; //将年龄修改为23
strcpy_s((*p).name, "张飞");//注意点和星号的优先级
【注】结构体成员如果是字符串,不能直接通过赋值号“=”去修改值,可以通过C语言中的拷贝函数strcpy去修改值。
在上面的例子中,我们都只是定义一个结构体变量,但在实际中,结构体变量不止一个,所以就需要一个数组来去存储。对比一般数组的定义,结构体数组也可以用相同的方式去定义、使用。下面举个例子:
struct Student //定义一个名为Student结构体
{
char name[20]; //姓名
int age; //年龄
int id; //学号
}stu[5]; //定义一个结构体数组stu[5],其长度是5,相当于要记录5个学生的信息
如何去使用结构体数组呢?如何访问结构体数组呢?我们看个简单的例子:
【更正】:上述 stu[3]
是定义了一个结构体数组,其长度是 3
,不是 5(笔者手误);
总结:以上是对结构体的定义以及如何使用做了简单的介绍,C语言中,我们实际要求的变量类型不能仅仅只通过C语言基础内置类型来定义,所以就引出了结构体,利用结构体来定义我们的变量,可以满足我们的要求,但是要注意的几点就是:
1.结构体如何定义,在定义的时候可以同时定义一个结构体变量,末尾必须以分好结尾;
2.结构体变量如何去访问其成员,可以通过运算符"."去访问;结构体指针变量如何去访问成员,可以通过箭头的形式去访问,例如:(*p).name == p -> name //左右两种访问方式等价。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。