科百科
当前位置: 首页 范文大全

如何定义结构体变量(结构体变量和结构体类型的定义)

时间:2023-05-25 作者: 小编 阅读量: 1 栏目名: 范文大全

DATAELEMENT中又包含DOMAIN,它是定义数据类型和字段长度。以方便日后的使用。在实际项目中,结构体是大量存在的。结构体在函数中的作用不是简便,其最主要的作用就是封装。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。

如何定义结构体变量?定义方式1:Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域} *LinkList;,今天小编就来聊一聊关于如何定义结构体变量?接下来我们就一起去研究一下吧!

如何定义结构体变量

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 >#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;

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

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

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

    推荐阅读
  • 被偏爱的总是有恃无恐什么意思(被偏爱的总是有恃无恐有什么寓意)

    以下内容大家不妨参考一二希望能帮到您!被偏爱的总是有恃无恐什么意思被偏爱的都有恃无恐的意思是:在爱情里得到更多爱的那个人,往往并不珍惜。对爱情满不在乎,认为有所依仗而对一切都无所畏惧。有恃无恐是一个成语,读音是[yǒushìwúkǒng]。因有所倚仗而不害怕。这句话是陈奕迅的《红玫瑰》中的一句歌词,歌词由台湾填词人李焯雄根据张爱玲的小说《白玫瑰与红玫瑰》所填。

  • 怎样去雀斑(五大去除雀斑的小妙招)

    从发病部位看,雀斑特别容易在鼻部和面颊等比较容易接受到日光的部位。隔天拿出两片即可泡水了,一个柠檬能喝一个星期左右。柠檬的美白功能不能小看,经常喝柠檬水美白绝对有惊人效果。胡萝卜汁:将新鲜胡萝卜研碎挤汁,取10-30毫升;每日早晚洗完脸后,以鲜汁拍脸,待干后用涂有植物油的手轻拍面部。每日喝1杯胡萝卜汁也有祛斑作用,不仅可以滑润、强健皮肤的作用,还可以防治皮肤粗糙及雀斑。

  • 这个游戏明明过于强大却过分谨慎(玩了不到10秒就让人心生退意的游戏)

    但是估计和老狼一样的玩家们也不在少数,那就是从来都是通过各种视频去观看各种恐怖游戏的视频,一方面是有着弹幕的陪伴,不至于那么害怕,另一方面就是看各类游戏主播的反应也是比较有趣的,就好比逃生2,纯黑展现了自己的男高音一幕,被广大玩家们戏称为B站3怂。不妨在下方留言评论,我是老狼,别忘了点击关注转发,咱们下篇文章再见,拜拜

  • 出席香港回归25周年大会(全国港澳研究会在穗举办庆祝香港回归祖国25周年论坛)

    暨南大学将贯彻重要讲话精神,进一步扛起香港青年培养的使命。全国政协委员、全国港澳研究会副会长、中国社科院台港澳研究中心主任黄平指出,“一国两制”的最高原则在于维护国家主权、安全、发展利益,保持香港、澳门长期繁荣稳定。心心相连是香港由治及兴的根本动能。

  • 牙膏尾部不同颜色代表什么(牙膏尾部的颜色的解释)

    我们一起去了解并探讨一下这个问题吧!牙膏尾部不同颜色代表什么牙膏软管尾部色标的作用是用于牙膏生产时封尾机的定位感应的,色标颜色取决于牙膏软管的包装设计,与产品的成分无任何关系。牙膏的生产程序中有一步是灌装封尾,是由专业的灌装封尾机完成的,在牙膏生产之前,牙膏是牙膏、牙膏筒是牙膏筒。充料完成后,软管放在自动封尾机位置,机器感应到相关颜色点,开始自动封住软管,以确保封尾时包装处于正确的位置。

  • 魔兽世界怀旧服天赋推荐攻略(魔兽世界怀旧服刷挂AOE天赋加点介绍)

    刷挂AOE天赋加点介绍.近期怀旧服近日已经正式开启公测,很多新手玩家都想知道怀旧服法师天赋怎么点?法师天赋有哪些,下面小编就来给大家介绍一下怀旧服中法师天赋的加点吧,不了解的小伙伴一起来看看吧!刷挂AOE天赋加点:只要满足了黄色框中的天赋加点,其他的天赋可以随便加点,小副本都可以随便刷!

  • 碧落黄泉碧落什么意思(碧落黄泉碧落的解释)

    下面更多详细答案一起来看看吧!碧落黄泉碧落什么意思碧落黄泉,汉语成语,拼音是bìluòhuángquán,意思是指宇宙的各个角落。

  • 家常炖排骨怎么炖好吃(土豆炖排骨的做法)

    下面更多详细答案一起来看看吧!家常炖排骨怎么炖好吃原料:肋排、土豆、芸豆。

  • 没有永恒不变的爱情周星驰(一生所爱始终是周星驰忘不掉的痛)

    唐书琛港式古风的作词,更是将孙悟空与紫霞仙子的爱情描绘的淋漓尽致。《一生所爱》对于周星驰而言,不仅仅是《大话西游》的一首插曲,也是他的一生挚爱。周星驰已经50多岁了,满头白发,孑然一生,没有伴侣在身边。2017年《西游·伏妖篇》上映,主题曲依然是《一生所爱》。同样的剧情,同样的遗憾,再次发生。

  • 猪肉饼的做法(猪肉饼怎么做)

    猪肉饼的做法食材:面粉300克,猪头肉180克,香菇5克,大白菜100克,粉丝100克,酵母3克,糖5克,鸡精3克,酱油5克。将面粉酵母糖放入盆中,用温水和面,一点点的加,用筷子搅拌把猪肉白菜生姜打碎,粉丝切碎。粉丝泡了一下午再用开水烫了一下。加酱油,鸡精,蚝油,13香,盐,香油搅拌。将旁边的面扯到中间来,这时面团是个圆的,提前热锅,多放点油,把面团放到锅里,快速用手把面团往四周延伸按压,按成饼。中小火煎熟即可。