结构体

结构体和共用体就是C语言提供的用于处理复杂数据类型的方式允许用户自定义数据类型在C语言中为构造数据类型(也称复合数据类型

它允许用户根据自己的需要利用已有的基本数据类型在制造出自己所需的数据类型。用于表示链表,树,堆栈等复杂的数据对象。

结构体的定义

数组:是由同类型的数据构成的一种数据结构,适合于对具有相同属性的数据进行批处理

结构体:是将不同类型的数据成员组织到统一的名字之下,适合于对关系密切、逻辑相关、具有相同或者不同属性的数据进行处理

共用体:虽然也能表示逻辑相关的不同类型的数据集合,但其数据成员是情形互斥的,每一刻只有一个数据成员起作用

结构体变量的定义

结构体模板的标准格式:

1
2
3
4
5
6
7
8
9
struct 结构体名
{
数据类型 成员1的名字;
数据类型 成员2的名字;
数据类型 成员3的名字;
……
数据类型 成员n的名字;

};/*注意,这里的分号不能忘了写*/

结构体标签:结构体的名字,作为用户自定义的结构体类型的标志,用于与其他结构体类型相区别。

结构体的各种信息是在{}中声明的

结构体成员:构成结构体的变量,每个结构体成员都有一个名字和相应的数据类型,其命名必须遵循变量的命名规则

注意,结构体模板只是声明了一种数据类型,定义了数据的组织形式,并未声明结构体类型的变量


C语言允许一下两种方法定义结构体变量:

第一种:先声明结构体模板,再定义结构体变量

1
2
3
4
5
6
7
8
9
10
11
struct 结构体名
{
数据类型 成员1的名字;
数据类型 成员2的名字;
数据类型 成员3的名字;
……
数据类型 成员n的名字;

};
struct student stu1

第二种:在声明结构体模板的同时定义结构体变量

1
2
3
4
5
6
7
8
9
struct 结构体名
{
数据类型 成员1的名字;
数据类型 成员2的名字;
数据类型 成员3的名字;
……
数据类型 成员n的名字;

}stu1;

用typedef(关键字)定义数据类型

关键字typedef用于为系统固有的或程序员自定义的数据类型定义一个别名。

通常数据类型的别名都是全英文大写的

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef int INTEGER; /*将int重新命名为INTEGER*/
typedef struct student STUDENT;/*将自己制造的student类型重命名为STUDENT*/
or
typedef struct student
{
数据类型 成员1的名字;
数据类型 成员2的名字;
数据类型 成员3的名字;
……
数据类型 成员n的名字;

}STUDENT;

上述的定义STUDENT的两个代码是等价的;

typedef只是为一种已存在的类型定义一个名字而已,并未定义一种新的数据类型

嵌套的结构体

嵌套的结构体就是在一个结构体内包含了另一个结构体作为其成员

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
char name[];
int ID;
DATE birthday;
}STUDENT

结构体变量的引用


C语言规定,不能将一个结构体变量作为一个整体进行输入,输出操作,只能对每个具体的成员进行输入,输出操作


访问格式: 结构体变量名 . 成员名

当引用嵌套体时,必须一级一级地通过访问格式找到最底层的成员后再引用

eg:stu1.birthday.day


C语言允许对具有相同结构体类型的变量进行整体赋值。

stu1 = stu2;

这样是非法的;

并非所有的结构体成员都可以使用赋值运算符来赋值,对字符数组类型成员进行赋值时,必须使用字符串处理函数strcpy()

结构体变量也和基本的变量一样有作用域,在函数外定义的结构体变量是全局声明,在函数内部定义的结构体变量是局部声明

结构体变量的地址是结构体变量所占内存空间的首地址,而结构体成员的地址值与结构体成员在结构体中所处的位置及其该成员所占内存的字节数有关

结构体所占内存的字节数

有四字节对齐原则

结构体数组的定义和初始化

结构体数组的定义

与基本的数据类型相同,结构体也是有其对应的数组的,是代表有与结构体中每个元素相同的一系类结构体的集合

结构体数组的初始化

可以在定义结构体数组时就对其进行初始化,和字符数组一样

也可以通过scanf()函数进行初始化,不过要注意每个结构体元素对应的数据类型

指向结构体的指针

结构一也是有指针的,定义结构体指针的方法如下:

第一种:STUDENT *pt = stu;

第二种:STUDENT *pt = &stu[0];

第三种:STUDENT *pt;

​ pt = stu;

以上三种定义的方法都是等价的

向函数传递结构体

第一种:用结构体的单个成员作为函数参数,向函数传递结构体的单个成员

第二种:用结构体变量作为函数参数,向函数传递结构体的完整结构

第三种:通过结构体指针或结构体数组作为函数参数,向函数传递结构体的地址

1

0

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信