结构体定义(C语言,用户自定义数据类型)

在实际应用问题中,一组数据往往具有不同的数据类型。例如,学生数据用来描述学生的基本情况,它有学号、姓名、性别、籍贯、出生年月等数据项目。又如设备数据用来描述设备的基本情况,所包含的数据项目有:设备编号、设备名称、类别、规格、单价、数量等。考察上述两种数据,它们都具有以下特征:

  1. 由多个数据对象聚合而成;
  2. 被聚合的数据对象的数据类型可以相同也可以不同;
  3. 成员具有相对的独立性,可以被单独访问。

1.结构类型的定义

结构类型是聚合数据对象的抽象,通常由程序员根据所要建立的聚合数据对象的聚合形态自行定义。

1.1定义结构类型的一般格式

定义一个结构类型的语法格式为:

struct [结构类型名]

{

  成员列表;

};

struct是关键字,声明要定义一个结构类型。结构类型名要用标识符命名,命名时要注意体现“见名知义”的原则,例如定义学生类型用Srudent,定义设备用Equipment,显然比用别的名称更加准确。

成员列表给出n个成员的声明,成员可以是基本类型变量、数组,也可以是另一结构类型变量等。对每个成员必须作类型说明,成员之间用分号隔开,其形式为:

类型名 成员名;

           .

           .

           .

类型名 成员名;

成员名的命名规则实际上就是一般数据对象的命名规则,也可以用标识符命名,同样要做到“见名知义”。还应该注意的是,大括号“}”后面的分号“;”,是必不可少的。

例如,定义一个用户描述学生数据的结构类型。

struct Student
{
int number;
char name[9];
int age;
char sex;
};

上面这个结构类型中,结构类型名为Student,它由四个成员组成。第一个成员为整型变量number,表示学号;第二个成员变量为字符数组型变量name,表示姓名;第三个成员变量为整型变量age,表示年龄;第四个成员变量为字符型变量,表示性别。

1.2结构类型的几点说明:

1)对于结构类型,系统是不会为之分配内存单元的。只有定义了结构变量后,系统才会分配内存单元给变量。

2}结构是由若干个数据项组成的,每一个数据项都属于一种已有定义的类型。每一个结构成员都不是独立的,它不是一般的变量,而是跟结构联系在一起的。

struct Student
{
int number;
char name[9];
int age;  /*①*/
char sex;
};
int age;   /*②*/
char sex;

上例中两个同名age和sex不会有命名冲突问题,因为①中的age是结构成员名,它是结构类型struct Student的成员,要访问该成员,必须通过结构变量名,②中的age是变量名,可以单独被引用。同理,sex也一样不存在命名冲突的问题。

3)结构类型可以嵌套定义。一个结构类型中可以包含另一个或一些结构类型。

struct Student
{
int number;
char name[9];
int age;  
struct Date
{
int year;
int month;  
int day;
}birthday;
char sex;
};

可以看出,成员birthday的类型又是结构类型(struct Date,描述日期的类型)

4)允许省略结构类型名,即允许定义无类型名的结构类型

struct 
{
int year;
int month;  
int day;
}birthday;

“无名”的结构类型必须后随结构变量(如birthday)的定义,并且仅能“一处”使用,这种形式通常用于内嵌在结构类型中的结构类型。

2.结构类型数据对象的定义及初始化

结构类型数据对象包括一般变量、指针、数组等,对应称为结构变量、结构指针、结构数组等。

定义结构数据对象,即是结构类型的实例化。换句话说,struct Student是抽象的,泛指所有的学生,而由struct Student创建的s1是具体的,指某个学生。

2.1定义结构变量

定义结构变量的三种方式:

(1)先定义结构类型再定义结构变量,这是标准方式,数据类型定义与数据对象分离,格式如下:

struct    结构类型名    变量名表;

例如,用已定义的学生类型struct Student定义学生结构变量:

struct Student student1,student2;

Student是结构类型名, student1和student2是变量名表,代表两个结构类型变量

(2)在定义结构类型的同时定义结构变量

struct Student
{
int number;
char name[9];
int age;  
struct Date
{
int year;
int month;  
int day;
}birthday;
char sex;
}student1,student2;
struct Student student3;/*正确,此处还是struct Student的作用域*/
struct Date birthday2;/*错误,因为已经不在struct Date的作用域内*/

可以看出,这种定义方式的作用与第一种大致相同,除在定义处外,在结构类型的作用域内还可以以第一种方式多处使用。

(3)直接定义结构变量,语法格式如下

struct

{

成员表列表;

}变量名列表;

例如:

struct
{
int number;
char name[9];
int age;  
struct Date
{
int year;
int month;  
int day;
}birthday;
char sex;
}student1,student2;

该方式与第二种方式的区别在于:它没有给出结构类型名,因此所定义的结构类型不能在程序中多处使用。

2.2.结构变量的初始化

可以在定义结构变量的同时对其初始化,语法格式如下:

struct 结构类型名 结构变量名={成员初始化值表};

例如:

struct
{
int number;
char name[9];
int age;  
struct Date
{
int year;
int month;  
int day;
}birthday;
char sex;
}student1={1001,"LiMing",1985,2,20,'M'};

可以看出,通过初始化设置了结构变量的成员的初值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值