结构(struct)

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

结构中能够使用不同的数据类型。 

    1. 结构说明和结构变量定义 

    在Turbo C中, 结构也是一种数据类型, 能够使用结构变量, 因此,  象其他 

类型的变量一样, 在使用结构变量时要先对其定义。 

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

     struct 结构名 

     { 

          类型  变量名; 

          类型  变量名; 

          ... 

     } 结构变量; 

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

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

无值型)。 

    构成结构的每个类型变量称为结构成员, 它象数组的元素一样, 但数组中 

元素是下面标来訪问的, 而结构是按变量名字来訪问成员的。 

    以下举一个样例来说明如何定义结构变量。 

     struct string 

     { 

          char name[8]; 

          int age; 

          char sex[2]; 

          char depart[20]; 

          float wage1, wage2, wage3, wage4, wage5; 

     } person; 

    这个样例定义了一个结构名为string的结构变量person,   假设省略变量名 

person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义 

时上例变成: 

     struct string 

     { 

          char name[8]; 

          int age; 

          char sex[2]; 

          char depart[20]; 

          float wage1, wage2, wage3, wage4, wage5; 

     }; 

     struct string person; 

    假设须要定义多个具有同样形式的结构变量时用这样的方法比較方便, 它先作 

结构说明, 再用结构名来定义变量。 

    比如: 

     struct string Tianyr, Liuqi, ...; 

    假设省略结构名, 则称之为无名结构, 这样的情况经常出如今函数内部, 用这 

种结构时前面的样例变成: 

     struct 

     { 

          char name[8]; 

          int age; 

          char sex[2]; 

          char depart[20]; 

          float wage1, wage2, wage3, wage4, wage5; 

     } Tianyr, Liuqi; 

    2. 结构变量的使用 

    结构是一个新的数据类型, 因此结构变量也能够象其他类型的变量一样赋值、 

运算, 不同的是结构变量以成员作为基本变量。 

    结构成员的表示方式为: 

          结构变量.成员名 

    假设将"结构变量.成员名"看成一个总体,  则这个总体的数据类型与结构中 

该成员的数据类型同样, 这样就可象前面所讲的变量那样使用。 

    以下这个样例定义了一个结构变量, 当中每一个成员都从键盘接收数据, 然后 

对结构中的浮点数求和, 并显示运算结果, 同一时候将数据以文本方式存入一个名为 

wage.dat的磁盘文件里。请注意这个样例中不同结构成员的訪问。 

    例3: 

     #i nclude <stdio.h> 

     main() 

     { 

          struct{                  /*定义一个结构变量*/ 

               char name[8]; 

               int age; 

               char sex[2]; 

               char depart[20]; 

               float wage1, wage2, wage3, wage4, 

wage5; 

          }a; 

          FILE *fp; 

          float wage; 

          char c=’Y’; 

          fp="fopen"("wage.dat", "w");    

/*创建一个文件仅仅写*/ 

          while(c==’Y’||c==’y’)         

/*推断是否继续循环*/ 

          { 

               printf("/nName:"); 

               scanf("%s", a.name);     /*输入姓名*/ 

               printf("Age:"); 

               scanf("%d", &a.wage);    /*输入年龄*/ 

               printf("Sex:"); 

               scanf("%d", 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); 

               printf("Wage4:"); 

               scanf("%f", &a.wage4); 

               printf("Wage5:"); 

               scanf("%f", &a.wage5); 

               

wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5; 

               printf("The sum of wage is 

%6.2f/n", wage);/*显示结果*/ 

               fprintf(fp, 

"%10s%4d%4s%30s%10.2f/n",  /*结果写入文件*/ 

                            a.name, a.age, a.sex, 

a.depart, wage); 

               while(1) 

               { 

                    printf("Continue?<Y/N>"); 

                    c="getche"(); 

                    

if(c==’Y’||c==’y’||c==’N’||c==’n’) 

                         break; 

               } 

          } 

          fclose(fp); 

     } 

    3. 结构数组和结构指针 

    结构是一种新的数据类型, 相同能够有结构数组和结构指针。 

    一、结构数组 

    结构数组就是具有同样结构类型的变量集合。假如要定义一个班级40个同学 

的姓名、性别、年龄和住址, 能够定义成一个结构数组。例如以下所看到的: 

     struct{ 

          char name[8]; 

          char sex[2]; 

          int age; 

          char addr[40]; 

     }student[40]; 

    也可定义为: 

     struct string{ 

          char name[8]; 

          char sex[2]; 

          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] 

    二、结构指针 

    结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定 

义, 比如用前面已说明的结构定义一个结构指针例如以下: 

     struct string{ 

          char name[8]; 

          char sex[2]; 

          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. 结构变量名不是指向该结构的地址, 这与数组名的含义不同,  因此若需 

要求结构中第一个成员的首地址应该是&[结构变量名]。 

    4. 结构的复杂形式 

    一、嵌套结构 

    嵌套结构是指在一个结构成员中能够包含其他一个结构, 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; 

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

方式是: 

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

    当中: 嵌套结构能够有非常多, 结构成员名为最内层结构中不是结构的成员名。 

  

    二、位结构 

    位结构是一种特殊的结构, 在需按位訪问一个字节或字的多个位时, 位结构 

比按位运算符更加方便。 

    位结构定义的一般形式为: 

     struct位结构名{ 

          数据类型 变量名: 整型常数; 

          数据类型 变量名: 整型常数; 

     } 位结构变量; 

    当中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整 

数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。 

    变量名是选择项, 能够不命名, 这样规定是为了排列须要。 

    比如: 以下定义了一个位结构。 

     struct{ 

          unsigned incon: 8;  

/*incon占用低字节的0~7共8位*/ 

          unsigned txcolor: 

4;/*txcolor占用高字节的0~3位共4位*/ 

          unsigned bgcolor: 

3;/*bgcolor占用高字节的4~6位共3位*/ 

          unsigned blink: 1;  /*blink占用高字节的第7位*/ 

     }ch; 

    位结构成员的訪问与结构成员的訪问同样。 

    比如: 訪问上例位结构中的bgcolor成员可写成: 

      ch.bgcolor 

  

    注意: 

    1. 位结构中的成员能够定义为unsigned, 也可定义为signed,  但当成员长 

度为1时, 会被觉得是unsigned类型。由于单个位不可能具有符号。 

    2. 位结构中的成员不能使用数组和指针, 但位结构变量能够是数组和指针, 

假设是指针, 其成员訪问方式同结构指针。 

    3. 位结构总长度(位数), 是各个位成员定义的位数之和,  能够超过两个字 

节。 

    4. 位结构成员能够与其他结构成员一起使用。 

    比如: 

     struct info{ 

          char name[8]; 

          int age; 

          struct addr address; 

          float pay; 

          unsigned state: 1; 

          unsigned pay: 1; 

          }workers;’ 

    上例的结构定义了关于一个工从的信息。当中有两个位结构成员, 每一个位结 

构成员仅仅有一位, 因此仅仅占一个字节但保存了两个信息, 该字节中第一位表示工 

人的状态, 第二位表示工资是否已发放。由此可见使用位结构能够节省存贮空间。 

c语言结构体使用方法的更多相关文章

  1. Go 语言 结构体和方法

    @ 目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt&quo ...

  2. C语言结构体初始化方法

    早上苏凯童鞋问我这个问题来着,写在这里. 我了解到的C中结构体初始化的方法大概有三种. 如这里我定义了一个结构体: typedef struct node { int x, y; }Node; 第一种 ...

  3. C语言结构体定义的几种方法

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  4. Go语言 - 结构体 | 方法

    自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...

  5. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  6. 对嵌入式开发C语言结构体的一点总结

    今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...

  7. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  8. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  9. Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

随机推荐

  1. AMR音频编码器概述及文件格式分析

    全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的. 一.分类 1. AMR: ...

  2. jsp 中对jar 包的引用

    <%@ page language="java" import="你需要的带包名的类" pageEncoding="gb2312"%& ...

  3. 小心LinkedHashMap的get()方法(转)

    这是一个来自实际项目的例子,在这个案例中,有同事基于jdk中的LinkedHashMap设计了一个LRUCache,为了提高性能,使用了 ReentrantReadWriteLock 读写锁:写锁对应 ...

  4. Android开发四大组件概述

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity具体解释 二.Service具体解释 三.Broadcast Receiver具体解释 四.Content Provid ...

  5. [C++]函数指针与指针函数

    函数指针与指针函数,之前总是分不清,今天就好好把它两认认清楚. 先从概念说起,简单是理解. 函数指针:是指针.一个指向某一个函数入口地址的指针. 指针函数:是函数.一个返回值是指针的函数. 记忆: 从 ...

  6. OCA读书笔记(17) - 移动数据

    Sql*load 1. sql*loader的文件有哪些? 日志文件:概述了作业的成功与失败以及所有相关错误的细节 错误文件(bad file):从输入文件中抽取的行可能会被sqlldr丢弃(原因可能 ...

  7. Company Story | Vistaprint

    Company Story | Vistaprint Company Story A Gap in the Small Business Marketplace It’s rare that a hi ...

  8. 使用Ajax以及Jquery.form异步上传图片

    一.前言 之前做图片上传一直用的第三方插件,Uploadify  这个应该是用的比較多的,相同也用过别的,在方便了自己的同一时候也非常赞叹人家的功能. 思来想去,仅仅会用别的人东西,始终自己学到的少, ...

  9. android新浪分享实例

    新浪分享比较简单,新浪有提供完整的demo. android实现新浪的分享功能,分3种分享情况: 纯文本的,带图片的,图片为本地图片(传入的是图片在手机的地址),第2种带图片的是,网络图片,图片地址为 ...

  10. [置顶] android系统功能调用大全

    1.从google搜索内容  Intent intent = new Intent();  intent.setAction(Intent.ACTION_WEB_SEARCH);  intent.pu ...