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;
每个结构成员名从最外层直到最内层逐个被列出,即嵌套式结构成员的表达方式是:
结构变量名.嵌套结构变量名.结构成员名
其中嵌套结构可以有很多,结构成员名为最内层结构中不是结构的成员名。