历史上的今天

今天是:2024年09月07日(星期六)

2019年09月07日 | 结构体变量和结构体类型的定义

发布者:czc天天 来源: eefocus关键字:结构体变量  结构体类型  定义 手机看文章 扫描二维码
随时随地手机看文章

结构体类型定义

定义方式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  

#include   //定义结构体  

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

#include   

 

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.2fn, 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; 

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

 

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

 


结构体定义变量的三种方法

1.先定义结构体,然后在定义结构体变量

 

struct stu{ /*定义学生结构体类型*/

    char name[20]; //学生姓名

[1] [2]
关键字:结构体变量  结构体类型  定义 引用地址:结构体变量和结构体类型的定义

上一篇:STM32八路ADC采用DMA方式
下一篇:​​​​​​​简述STM32 CAN总线的设置

推荐阅读

九月,是学生们的开学季。近日,一则“学生进校门,刷个脸就行”的新闻报道占领了头条。报道显示,南山外国语学校高级中学校使用了人脸识别技术,学生在校门口只需往闸门前一站,人脸识别系统便能快速识别学生面部,检索该学生是否为本校学生,继而选择是否打开闸门。然而,将人脸识别落地在智慧校园的这类事件并非个例。 此前,据北大官方微信,北京大学...
电车汇消息:“三星SDI已经就动力电池产品供应与宇通客车、中车电动展开了比较密切的沟通,很可能进入他们的电池供应体系。”近日,有业内人士向电车汇透露了这一消息。 值得关注的还有另一则消息,2019年6月24日,陕西省发展和改革委员会官网发布了一则“关于三星环新(西安)动力电池有限公司扩建120Ah锂离子动力电池生产线项目节能报告的审查意见”的...
物联网(IoT)超低功耗无线技术的创新者Atmosic™ Technologies与全球领先的 OEM 电子元器件设计和制造商SMK Electronics Corporation今天宣布建立战略合作伙伴关系,将Atmosic的 M3 SoC集成到 SMK 的一系列物联网设备中。包括遥控器和传感器在内的这些物联网解决方案集成了Atmosic的受控能量收集技术,及超低功耗射频和射频唤醒接收器,可实现物联网...
2018年,老牌房地产商恒大开启了他的造车梦,如今车虽然没造出来,号称斥资千亿的汽车制造厂倒是规模庞大,引人注目。此前,恒大的造车工厂被媒体曝光,部署在广州的四个车间斥资1600亿,采用德国舒勒全自动冲压生产线、杜尔全自动涂装生产线以及日本发那科智能设备,各种造车配备应有尽有。四个车间中,第一个冲压车间,全自动化冲压,依靠德国先进技术,...

史海拾趣

问答坊 | AI 解惑

今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

我们有工程师级的程序,相信很多人都看不懂,曾经给人看过。 这次写了个新手级的AVR TWI程序,方便学习者了解TWI工作流程和原理。 显得稍微有点乱,整理下再发上来。 程序实现功能: 主机从0到255循环发送字节到从机,从机收到后返回 ...…

查看全部问答∨

英特尔推出7年超长生命周期的新款至强处理器

英特尔推出7年超长生命周期的新款至强处理器 上网时间:2008年03月05日 收藏 打印版 推荐给同仁 发送查询 2008年2月27日,美国加利福尼亚州圣克拉拉市讯--英特尔公司今日宣布推出面向嵌入式市场的全新处理器(具有长达7年的 ...…

查看全部问答∨

触摸屏增长迅速,魅力难挡

触摸屏增长迅速,正在激起激烈的竞争、推动着技术发展,以及引起OEM的兴趣。iSuppli公司曾经预测,2012年全球主要触摸屏技术的出货额将从2006年的24亿美元上升到44亿美元。面对如此高速增长、竞争和技术多样性,触摸屏产业正在快速进化。   ...…

查看全部问答∨

单片机初学者几个不易掌握的概念

一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中 ,连连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很 多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各 器 ...…

查看全部问答∨

WISOM218/228 Q2686/2687

我司是WAVECOM代理商提供技术(软/硬件)支持以及DEMO. 联系方式:   QQ:1109321905(请注明) 13554943187   Kavin (钟庆福) …

查看全部问答∨

文件怎么找不到呢?

<fastrts67x.h>文件怎么找不到呢? 请问是怎么回事呢 …

查看全部问答∨

项目寻嵌入式软件开发人员

在杭州,有谁懂WINCE嵌入式驱动,播放器和看图器软件开发,请和我联系,有偿服务哦!QQ:672208742…

查看全部问答∨

camera 进行cetk测试时,挂死的问题

各位大侠高手请支招,谢谢了。问题现象如下   平台:wince 6.0 +  arm9(公司自己的SOC)   摄像头  OV7680 和OV2650, 两个都支持   用ce私有目录下的测试应用程序,可以正常preview,CAPTU ...…

查看全部问答∨

WindowsCE.net 4.2目录解析

windowsCE的目录结构巨大而庞杂,尽管windowsCE的帮助对这个庞大的目录结构进行了说明仍然有很多目录下对应的代码在windowsCE help没有介绍其具体用途,下面就将windowsCE的目录结构进行简单的介绍。 1.SDK 在windowsCE.net4.2的根目录下存在PL ...…

查看全部问答∨

跪求PB6.0中的文件

那位老大装了pb6.0出来吼一声,或者加我qq,84529164。急需里面的几个文件,感激不尽!…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved