2025年5月21日 星期三 乙巳(蛇)年 二月廿三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

结构体变量和结构体类型的定义

时间:02-27来源:作者:点击数:76

1.结构体类型定义

定义方式1:

  • Typedef struct LNode {
  • int data; // 数据域
  • struct LNode *next; // 指针域
  • } *LinkList;

定义方式2:

  • struct LNode {
  • int data; // 数据域
  • struct LNode *next; // 指针域
  • };
  • Typedef struct LNode *LinkList;

以上两个定义方式是等价的,是将*LinkList定 义为struct LNode类型,即LinkList被定义为一个类型名。这样就可以用LinkList来定义说明新的变量了,如:

  • LinkList L;

即将L定义为struct LNode类型的指针变量。

2.结构体类型变量定义

定义方式1:

  • struct LNode {
  • int data; // 数据域
  • struct LNode *next; // 指针域
  • }LnodeA;

定义方式2:

  • struct LNode {
  • int data; // 数据域
  • struct LNode *next; // 指针域
  • };
  • struct LNode LnodeA;

以上两个定义方式也是等价的,这样就将LnodeA定义为一个struct LNode类型的变量,即LnodeA为一个struct LNode类型的变量名。


结构体内标的定义方式

1.结构体,透明表区,DATA ELEMENT,DOMAIN

透明表是对一个物理表的逻辑描述,透明表里有许多字段,并且定义某些字段为 PRIMARY KEY,字段里又包含 DATA ELEMENT,用来描述语言属性和技术属性。DATA ELEMENT 中又包含 DOMAIN,它是定义数据类型和字段长度。

结构体一般是用来定义一个结构变量,有临时数据的储存,没有 PRIMARY KEY,结构体里包含 COMPONENT 而不是 FIELD

2.Internal table 中的属性分为三种 LINE TYPE ,KEY,TABLE KIND。

LINE TYPE 在 INTERNAL TABLE 里单独的一行叫 LINE TYPE,每一行的结构都一样。

KEY:相当于数据库里的主键。在排序的时候有用,UNIQUE 或 NON-UNIQUE。

TABLE KIND:分为 STANDARD,SORTED,HASHED。

三种类型的内表的定义

标准表:

  • DATA itab1 TYPE STANDARD TABLE OF scarr WITH NON-UNIQUE KEY carrid.

排序表:

  • DATA itab2 TYPE SORTED TABLE OF scarr WITH NON-UNIQUE KEY carrid.

哈希表:

  • DATA itab3 TYPE HASHED TABLE OF scarr WITH UNIQUE KEY carrid.

一般定义方法(标准表)

根据数据库表定义标准表

  • DATA itab4 TYPE TABLE OF scarr.

根据自建的结构变量定义标准表(最常用)

  • DATA: BEGIN OF wa,
  • carrid TYPE scarr-carrid,
  • carrnamen TYPE scarr-carrname,
  • END OF wa.
  • DATA itab5 LIKE TABLE OF wa.

根据数据字典中的表类型定义标准表

  • DATA itab6 TYPE ztabtype00_1.

根据内表定义内表

  • DATA itab7 LIKE itab6.

根据内表定义结构

  • DATA wa1 LIKE LINE OF itab7.

3. 定义结构的方式

根据数据字典中的表或者结构来定义程序的结构变量(或类型)

  • types str1 type spfli.
  • data str2 type sflight.

自定义程序中的结构变量(或类型)-最常见的

  • data: begin of wa,
  • carrid type spfli-carrid,
  • com(10) type c,
  • end of wa.

根据内表定义结构

  • data wa like line of itab.

注:根据数据库表定义的一定是结构

同名字段的赋值(重要)

  • Move-corresponding A to B.

read 是读取内表的一条数据

  • read table itab like table of wa.

读一内表的多条数据应用 loop

  • loop at itab into wa.

C/C++ 语言中的解释

结构体定义

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

结构体作用

结构体和其他类型基础数据类型一样,例如 int 类型,char 类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。 

在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。  

结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。

结构体的大小与内存对齐

结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是 32Bit 字长的 CPU,对这类型的 CPU 取 4 个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会相对更高效,这就是内存对齐的由来。

每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16 来改变这一系数,其中的n就是你要指定的"对齐系数"。  

规则:

  • 1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。  
  • 2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照< span class="marked">#pragma pack 指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。  
  • 3、结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

C++ 中的结构体

在 C 语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在 C 语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C 语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在 C++ 中,考虑到 C 语言到 C++ 语言过渡的连续性,对结构体进行了扩展,C++ 的结构体可以包含函数,这样,C++ 的结构体也具有类的功能,与class 不同的是,结构体包含的函数默认为 public,而不是 private。  

C++ 控制台输出例子:

实例

  • #include <cstdlib> 
  • #include <iostream>  //定义结构体  
  • using namespace std; 
  • struct point 
  • {  
  • //包含两个变量成员 
  • int x;  
  • int y; 
  • };  
  • int main(int argc, char *argv[]) 
  • {  
  • struct point pt; 
  • pt.x=1; 
  • pt.y=2; 
  • cout<<pt.x<<endl<<pt.y<<endl;
  • return EXIT_SUCCESS;
  • }

C++中的结构体与类的区别

类与结构体在 C++ 中只有两点区别,除此这外无任何区别。  

  • (1)class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。  
  • (2)从 class 继承默认是 private 继承,而从 struct 继承默认是 public 继承。

这两种定义有什么区别?

  • typedef struct student
  • {
  • int num;
  • struct student *next;
  • }student;
  • struct student
  • {
  • int num;
  • struct student *next;
  • };

第二个 struct student 是定义了一个 student 结构体,这个明白吧。

第一个是用 typedef 把 struct student 这个结构体类型名字重新定义为 student,也就是说 struct student 和 student 表示同一个事物,都是一个类型的标识符,比如 typedef int zhengshu; 就是你把整型 int 重命名为 zhengshu,下面定义:int i; 和 zhengshu i; 两句就是等价的了。

结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型。

结构说明和结构变量定义

在 Turbo C 中,结构也是一种数据类型,可以使用结构变量,因此,象其它类型的变量一样,在使用结构变量时要先对其定义。

定义结构变量的一般格式为:

  • struct 结构名
  • {
  • 类型 变量名;
  • 类型 变量名;
  • ...
  • } 结构变量;

结构名是结构的标识符不是变量名。

类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和无值型)。

构成结构的每一个类型变量称为结构成员,它象数组的元素一样,但数组中元素是以下标来访问的,而结构是按变量名字来访问成员的。

下面举一个例子来说明怎样定义结构变量。

  • struct string
  • {
  • char name[8];
  • int age;
  • char sex[4];
  • char depart[20];
  • float wage1,wage2,wage3;
  • }person;

这个例子定义了一个结构名为 string 的结构变量 person,如果省略变量名 person,则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上例变成:

  • struct string
  • {
  • char name[8];
  • int age;
  • char sex[4];
  • char depart[20];
  • float wage1,wage2,wage3;
  • };
  • struct string person;

如果需要定义多个具有相同形式的结构变量时用这种方法比较方便,它先作结构说明,再用结构名来定义变量。

例如:

  • struct string Tianyr, Liuqi, ...;

如果省略结构名,则称之为无名结构,这种情况常常出现在函数内部,用这种结构时前面的例子变成:

  • struct
  • {
  • char name[8];
  • int age;
  • char sex[4];
  • char depart[20];
  • float wage1,wage2,wage3;
  • } Tianyr, Liuqi;

结构变量的使用

结构是一个新的数据类型,因此结构变量也可以象其它类型的变量一样赋值、运算,不同的是结构变量以成员作为基本变量。

结构成员的表示方式为:

  • 结构变量.成员名

如果将结构变量.成员名看成一个整体,则这个整体的数据类型与结构中该成员的数据类型相同,这样就可象前面所讲的变量那样使用。

下面这个例子定义了一个结构变量,其中每个成员都从键盘接收数据,然后对结构中的浮点数求和,并显示运算结果。请注意这个例子中不同结构成员的访问。

实例

  • #include <stdio.h>
  • #include <conio.h>
  • int main()
  • {
  • struct
  • {
  • char name[8];
  • int age;
  • char sex[4];
  • char depart[20];
  • float wage1,wage2,wage3;
  • }a;
  • float wage;
  • char c='Y';
  • while(c=='Y'||c=='y')
  • {
  • printf(\nName:);
  • scanf(%s, a.name);
  • printf(Age:);
  • scanf(%d, &a.wage);
  • printf(Sex:);
  • scanf(%s, a.sex);
  • printf(Dept:);
  • scanf(%s, a.depart);
  • printf(Wage1:);
  • scanf(%f, &a.wage1);
  • printf(Wage2:);
  • scanf(%f, &a.wage2);
  • printf(Wage3:);
  • scanf(%f, &a.wage3);
  • wage=a.wage1+a.wage2+a.wage3;
  • printf(The sum of wage is %6.2f\n, wage);
  • printf(Continue?);
  • c=getche();
  • }
  • }

结构数组和结构指针

结构是一种新的数据类型, 同样可以有结构数组和结构指针。

1.结构数组

结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下所示:

  • struct
  • {
  • char name[8];
  • char sex[4];
  • int age;
  • char addr[40];
  • }student[40];

也可定义为:

  • struct string
  • {
  • char name[8];
  • char sex[4];
  • int age;
  • char addr[40];
  • };
  • struct string student[40];

需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为:

  • 结构数组元素.成员名

例如:

  • student[0].name
  • student[30].age

实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是一个结构变量, 第二维是结构成员。

注意: 结构数组的成员也可以是数组变量。

例如:

  • struct a
  • {
  • int m[3][5];
  • float f;
  • char s[20];
  • }y[4];

为了访问结构a中结构变量y[2]的这个变量, 可写成y[2].m[1][4]

2.结构指针

结构指针是指向结构的指针。它由一个加在结构变量名前的* 操作符来定义, 例如用前面已说明的结构定义一个结构指针如下:

  • struct string
  • {
  • char name[8];
  • char sex[4];
  • int age;
  • char addr[40];
  • }*student;

也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。

  • struct string *student;

使用结构指针对结构成员的访问,与结构变量对结构成员的访问在表达方式上有所不同。结构指针对结构成员的访问表示为:

  • 结构指针名->结构成员

其中->是两个符号-和>的组合,好象一个箭头指向结构成员。例如要给上面定义的结构中 name 和 age 赋值,可以用下面语句:

  • strcpy(student->name, Lu G.C);
  • student->age=18;

实际上,student->name就是(*student).name的缩写形式。

需要指出的是结构指针是指向结构的一个指针,即结构中第一个成员的首地址,因此在使用之前应该对结构指针初始化,即分配整个结构长度的字节空间,这可用下面函数完成, 仍以上例来说明如下:

  • student=(struct string*)malloc(size of (struct string));

size of (struct string)自动求取 string 结构的字节长度, malloc() 函数定义了一个大小为结构长度的内存区域,然后将其诈地址作为结构指针返回。

注意:

  • 1. 结构作为一种数据类型,因此定义的结构变量或结构指针变量同样有局部变量和全程变量,视定义的位置而定。
  • 2. 结构变量名不是指向该结构的地址,这与数组名的含义不同,因此若需要求结构中第一个成员的首地址应该是&[结构变量名]。
  • 3. 结构的复杂形式:嵌套结构

嵌套结构是指在一个结构成员中可以包括其它一个结构,Turbo C 允许这种嵌套。

例如: 下面是一个有嵌套的结构

  • struct string
  • {
  • char name[8];
  • int age;
  • struct addr address;
  • } student;

其中: addr 为另一个结构的结构名, 必须要先进行, 说明, 即

  • struct addr
  • {
  • char city[20];
  • unsigned lon zipcode;
  • char tel[14];
  • }

如果要给 student 结构中成员 address 结构中的 zipcode 赋值, 则可写成:

  • student.address.zipcode=200001;

每个结构成员名从最外层直到最内层逐个被列出,即嵌套式结构成员的表达方式是:

  • 结构变量名.嵌套结构变量名.结构成员名

其中嵌套结构可以有很多,结构成员名为最内层结构中不是结构的成员名。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门