说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

结构体与共用体-C语言教程

HTML文档下载 WORD文档下载 PDF文档下载
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。

 

11.1 定义一个结构的一般形式

    在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。 它相当于其它高级语言中的记录。“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。

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

struct 结构名

    {成员表列};

成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:

    类型说明符 成员名;

成员名的命名应符合标识符的书写规定。例如:

 

    struct stu    {        int num;        char name[20];        char sex;        float score;};

 

 

在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。凡说明为结构stu的变量都由上述4个成员组成。由此可见, 结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。

 

11.2 结构类型变量的说明

 

说明结构变量有以下三种方法。以上面定义的stu为例来加以说明。

1. 先定义结构,再说明结构变量。

如:

 

struct stu    {        int num;        char name[20];        char sex;        float score;    };    struct stu boy1,boy2;

 

 

说明了两个变量boy1和boy2为stu结构类型。也可以用宏定义使一个符号常量来表示一个结构类型。

例如:

 

#define STU struct stuSTU    {        int num;        char name[20];        char sex;        float score;    };STU boy1,boy2;

 

 

2. 在定义结构类型的同时说明结构变量。

例如:

 

struct stu    {        int num;        char name[20];        char sex;        float score;}boy1,boy2;

 

 

这种形式的说明的一般形式为:

struct 结构名

    {

成员表列

}变量名表列;

3. 直接说明结构变量。

例如:

 

struct    {        int num;        char name[20];        char sex;        float score;}boy1,boy2;

 

 

这种形式的说明的一般形式为:

struct

    {

成员表列

}变量名表列;

第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量。三种方法中说明的boy1,boy2变量都具有下图所示的结构。

 

说明了boy1,boy2变量为stu类型后,即可向这两个变量中的各个成员赋值。在上述stu结构定义中,所有的成员都是基本数据类型或数组类型。

成员也可以又是一个结构,即构成了嵌套的结构。例如,下图给出了另一个数据结构。

 

按图可给出以下结构定义:

 

struct date{        int month;        int day;        int year;    };    struct{        int num;        char name[20];        char sex;        struct date birthday;        float score;    }boy1,boy2;

首先定义一个结构date,由month(月)、day(日)、year(年) 三个成员组成。 在定义并说明变量 boy1 和 boy2 时,其中的成员birthday被说明为data结构类型。成员名可与程序中其它变量同名,互不干扰。

11.3 结构变量成员的表示方法

在程序中使用结构变量时,往往不把它作为一个整体来使用。在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。

表示结构变量成员的一般形式是:

    结构变量名.成员名

例如:

    boy1.num          即第一个人的学号

boy2.sex          即第二个人的性别

如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。

例如:

boy1.birthday.month

即第一个人出生的月份成员可以在程序中单独使用,与普通变量完全相同。

11.4 结构变量的赋值

结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。

【例11.1】给结构变量赋值并输出其值。

 

main(){    struct stu    {      int num;      char *name;      char sex;      float score;    } boy1,boy2;    boy1.num=102;    boy1.name="Zhang ping";    printf("input sex and score\n");    scanf("%c %f",&boy1.sex,&boy1.score);    boy2=boy1;    printf("Number=%d\nName=%s\n",boy2.num,boy2.name);    printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}

本程序中用赋值语句给num和name两个成员赋值,name是一个字符串指针变量。用scanf函数动态地输入sex和score成员值,然后把boy1的所有成员的值整体赋予boy2。最后分别输出boy2的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。

11.5 结构变量的初始化

和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。

【例11.2】对结构变量初始化。

 

main(){    struct stu    /*定义结构*/    {      int num;      char *name;      char sex;      float score;    }boy2,boy1={102,"Zhang ping",'M',78.5}; boy2=boy1; printf("Number=%d\nName=%s\n",boy2.num,boy2.name); printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}

本例中,boy2,boy1均被定义为外部结构变量,并对boy1作了初始化赋值。在main函数中,把boy1的值整体赋予boy2,然后用两个printf语句输出boy2各成员的值。

 

11.6 结构数组的定义

 

数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。

方法和结构变量相似,只需说明它为数组类型即可。

例如:

 

struct stu    {        int num;        char *name;        char sex;        float score;}boy[5];

定义了一个结构数组boy,共有5个元素,boy[0]~boy[4]。每个数组元素都具有struct stu的结构形式。对结构数组可以作初始化赋值。

例如:

 

struct stu    {        int num;        char *name;        char sex;        float score;    }boy[5]={             {101,"Li ping","M",45},             {102,"Zhang ping","M",62.5},             {103,"He fang","F",92.5},             {104,"Cheng ling","F",87},             {105,"Wang ming","M",58};}

当对全部元素作初始化赋值时,也可不给出数组长度。

【例11.3】计算学生的平均成绩和不及格的人数。

 

struct stu{    int num;    char *name;    char sex;    float score;}boy[5]={          {101,"Li ping",'M',45},          {102,"Zhang ping",'M',62.5},          {103,"He fang",'F',92.5},          {104,"Cheng ling",'F',87},          {105,"Wang ming",'M',58},        };main(){    int i,c=0;    float ave,s=0;    for(i=0;i<5;i++)    {      s+=boy[i].score;      if(boy[i].score<60) c+=1;    }    printf("s=%f\n",s);    ave=s/5;    printf("average=%f\ncount=%d\n",ave,c);}

本例程序中定义了一个外部结构数组boy,共5个元素,并作了初始化赋值。在main函数中用for语句逐个累加各元素的score 成员值存于s之中,如score的值小于60(不及格)即计数器C加1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。

【例11.4】建立同学通讯录

 

#include"stdio.h"#define NUM 3struct mem{    char name[20];    char phone[10];};main(){    struct mem man[NUM];    int i;    for(i=0;i<NUM;i++)     {      printf("input name:\n");      gets(man[i].name);      printf("input phone:\n");      gets(man[i].phone);     }    printf("name\t\t\tphone\n\n");    for(i=0;i<NUM;i++)      printf("%s\t\t\t%s\n",man[i].name,man[i].phone);}

本程序中定义了一个结构mem,它有两个成员name和phone用来表示姓名和电话号码。在主函数中定义man为具有mem 类型的结构数组。在for语句中,用gets函数分别输入各个元素中两个成员的值。然后又在for语句中用printf语句输出各元素中两个成员值。

 

11.7 结构指针变量的说明和使用

 

11.7.1 指向结构变量的指针

一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。

结构指针变量说明的一般形式为:

    struct 结构名 *结构指针变量名

例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为:

    struct stu *pstu;

当然也可在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。 

赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。如果boy是被说明为stu类型的结构变量,则:

    pstu=&boy

是正确的,而:

    pstu=&stu

是错误的。

结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。因此上面&stu这种写法是错误的,不可能去取一个结构名的首地址。有了结构指针变量,就能更方便地访问结构变量的各个成员。

其访问的一般形式为:

    (*结构指针变量).成员名

或为:

        结构指针变量->成员名

例如:

(*pstu).num

或者:

    pstu->num

应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。

下面通过例子来说明结构指针变量的具体说明和使用方法。

【例11.5】

 

struct stu    {      int num;      char *name;      char sex;      float score;    } boy1={102,"Zhang ping",'M',78.5},*pstu;main(){    pstu=&boy1;    printf("Number=%d\nName=%s\n",boy1.num,boy1.name);    printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);    printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);    printf("Sex=%c\nScore=%f\n\n",(*pstu).sex,(*pstu).score);    printf("Number=%d\nName=%s\n",pstu->num,pstu->name);    printf("Sex=%c\nScore=%f\n\n",pstu->sex,pstu->score);}

    本例程序定义了一个结构stu,定义了stu类型结构变量boy1并作了初始化赋值,还定义了一个指向stu类型结构的指针变量pstu。在main函数中,pstu被赋予boy1的地址,因此pstu指向boy1。然后在printf语句内用三种形式输出boy1的各个成员值。从运行结果可以看出:

结构变量.成员名

(*结构指针变量).成员名

结构指针变量->成员名

这三种用于表示结构成员的形式是完全等效的。

 

11.7.2 指向结构数组的指针

 

指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。

设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况是一致的。

【例11.6】用指针变量输出结构数组。

 

struct stu{    int num;    char *name;    char sex;    float score;}boy[5]={          {101,"Zhou ping",'M',45},          {102,"Zhang ping",'M',62.5},          {103,"Liou fang",'F',92.5},          {104,"Cheng ling",'F',87},          {105,"Wang ming",'M',58},        };main(){ struct stu *ps; printf("No\tName\t\t\tSex\tScore\t\n"); for(ps=boy;ps<boy+5;ps++) printf("%d\t%s\t\t%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->score);}

在程序中,定义了stu结构类型的外部数组boy并作了初始化赋值。在main函数内定义ps为指向stu类型的指针。在循环语句for的表达式1中,ps被赋予boy的首地址,然后循环5次,输出boy数组中各成员值。

应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。

ps=&boy[1].sex;

而只能是:

    ps=boy;(赋予数组首地址)

或者是:

ps=&boy[0];(赋予0号元素首地址)

11.7.3 结构指针变量作函数参数

在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。

【例11.7】计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。

 

struct stu{    int num;    char *name;    char sex;    float score;}boy[5]={        {101,"Li ping",'M',45},        {102,"Zhang ping",'M',62.5},        {103,"He fang",'F',92.5},        {104,"Cheng ling",'F',87},        {105,"Wang ming",'M',58},      };main(){    struct stu *ps;    void ave(struct stu *ps);    ps=boy;    ave(ps);}void ave(struct stu *ps){    int c=0,i;    float ave,s=0;    for(i=0;i<5;i++,ps++)      {        s+=ps->score;        if(ps->score<60) c+=1;      }    printf("s=%f\n",s);    ave=s/5;    printf("average=%f\ncount=%d\n",ave,c);}

本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。

由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。

 

11.8 动态存储分配

 

在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。

例如:

int n;

    scanf("%d",&n);

int a[n];

用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

常用的内存管理函数有以下三个:

1. 分配内存空间函数malloc

调用形式:

  (类型说明符*)malloc(size)

功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。

(类型说明符*)表示把返回值强制转换为该类型指针。

“size”是一个无符号数。

例如:

          pc=(char *)malloc(100);

表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。

2. 分配内存空间函数 calloc

 calloc 也用于分配内存空间。

调用形式:

  (类型说明符*)calloc(n,size)

功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。

(类型说明符*)用于强制类型转换。

calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。

例如:

     ps=(struet stu*)calloc(2,sizeof(struct stu));

其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

2. 释放内存空间函数free

调用形式:

  free(void*ptr);

功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。

【例11.8】分配一块区域,输入一个学生数据。

 

main(){    struct stu    {      int num;      char *name;      char sex;      float score;    }  *ps;    ps=(struct stu*)malloc(sizeof(struct stu));    ps->num=102;    ps->name="Zhang ping";    ps->sex='M';    ps->score=62.5;    printf("Number=%d\nName=%s\n",ps->num,ps->name);    printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);    free(ps);}

本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

 

11.9 链表的概念

 

在例7.8中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少块内存空间,也就是说要建立多少个结点。当然用结构数组也可以完成上述工作,但如果预先不能准确把握学生人数,也就无法确定数组大小。而且当学生留级、退学之后也不能把该元素占用的空间从数组中释放出来。

用动态存储的方法可以很好地解决这些问题。有一个学生就分配一个结点,无须预先确定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。

可在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域内又存放第三个结点的首地址,如此串连下去直到最后一个结点。最后一个结点因无后续结点连接,其指针域可赋为0。这样一种连接方式,在数据结构中称为“链表”。

下图为最一简单链表的示意图。

 

图中,第0个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号num,姓名name,性别sex和成绩score等。另一个域为指针域,存放下一结点的首地址。链表中的每一个结点都是同一种结构类型。

例如,一个存放学生学号和成绩的结点应为以下结构:

    struct stu

    { int num;

      int score;

      struct stu *next;

}

前两个成员项组成数据域,后一个成员项next构成指针域,它是一个指向stu类型结构的指针变量。

链表的基本操作对链表的主要操作有以下几种:

1. 建立链表;

2. 结构的查找与输出;

3. 插入一个结点;

4. 删除一个结点;

下面通过例题来说明这些操作。

【例11.9】建立一个三个结点的链表,存放学生数据。为简单起见, 我们假定学生数据结构中只有学号和年龄两项。可编写一个建立链表的函数creat。程序如下:

 

 #define NULL 0    #define TYPE struct stu    #define LEN sizeof (struct stu)    struct stu        {          int num;          int age;          struct stu *next;        };    TYPE *creat(int n)    {        struct stu *head,*pf,*pb;        int i;        for(i=0;i<n;i++)        {              pb=(TYPE*) malloc(LEN);          printf("input Number and  Age\n");          scanf("%d%d",&pb->num,&pb->age);          if(i==0)          pf=head=pb;          else pf->next=pb;          pb->next=NULL;          pf=pb;        }        return(head);    }

在函数外首先用宏定义对三个符号常量作了定义。这里用 TYPE表示struct stu,用LEN表示sizeof(struct stu)主要的目的是为了在以下程序内减少书写并使阅读更加方便。结构stu定义为外部类型,程序中的各个函数均可使用该定义。

creat函数用于建立一个有n个结点的链表,它是一个指针函数,它返回的指针指向stu结构。在creat函数内定义了三个stu结构的指针变量。head为头指针,pf为指向两相邻结点的前一结点的指针变量。pb为后一结点的指针变量。

 

11.10 枚举类型

 

在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

 

11.10.1 枚举类型的定义和枚举变量的说明

1. 枚举的定义枚举类型定义的一般形式为:

    enum 枚举名{ 枚举值表 };

在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

例如:

 

该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。

2. 枚举变量的说明

如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。

设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:

enum weekday{ sun,mou,tue,wed,thu,fri,sat };

enum weekday a,b,c;

或者为:

enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;

或者为:

enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;

11.10.2 枚举类型变量的赋值和使用

枚举类型在使用中有以下规定:

1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。

  例如对枚举weekday的元素再作以下赋值:

    sun=5;

mon=2;

sun=mon;

都是错误的。

2. 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6。

【例11.10】

 

main(){    enum weekday    { sun,mon,tue,wed,thu,fri,sat } a,b,c;    a=sun;    b=mon;    c=tue;    printf("%d,%d,%d",a,b,c);}

说明:

只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如:

    a=sum;

b=mon;

是正确的。而:

    a=0;

b=1;

是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换。

如:

    a=(enum weekday)2;

其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:

    a=tue;

还应该说明的是枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。

【例11.11】

 

main(){    enum body    { a,b,c,d } month[31],j;    int i;    j=a;    for(i=1;i<=30;i++){      month[i]=j;      j++;      if (j>d) j=a;    }    for(i=1;i<=30;i++){      switch(month[i])      {        case a:printf(" %2d  %c\t",i,'a'); break;        case b:printf(" %2d  %c\t",i,'b'); break;        case c:printf(" %2d  %c\t",i,'c'); break;        case d:printf(" %2d  %c\t",i,'d'); break;        default:break;      }    }    printf("\n");}

11.11 类型定义符typedef

C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。例如,有整型量a,b,其说明如下:

    int a,b;

其中int是整型变量的类型说明符。int的完整写法为integer,为了增加程序的可读性,可把整型说明符用typedef定义为:

typedef int INTEGER

这以后就可用INTEGER来代替int作整型变量的类型说明了。 

例如:

    INTEGER a,b;

它等效于:

    int a,b;

用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。

例如:

    typedef char NAME[20];    表示NAME是字符数组类型,数组长度为20。然后可用NAME 说明变量,如:

    NAME a1,a2,s1,s2;

完全等效于:

    char a1[20],a2[20],s1[20],s2[20]

又如:

    typedef struct stu

    { char name[20];

      int age;

      char sex;

           } STU;

定义STU表示stu的结构类型,然后可用STU来说明结构变量:

STU body1,body2;

typedef定义的一般形式为:

typedef 原类型名  新类型名 

其中原类型名中含有定义部分,新类型名一般用大写表示,以便于区别。

有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。

 

三星电子大中华区副总裁黄伽卫:构建移动互联生态,解读内容服务新方向 MDCC 2013移动开发者大会:新浪潮,新硬件! 网站建设,如何平衡产品特性和利益需求? 开发者是如何提升技能水平的 Databricks核心成员专访:大数据时代“智能手机”Spark 数据密集、快速启动、核心应用,IBM存储重兵布阵 企业移动应用与BYOD:移动互联大势所趋 “首届智能硬件峰会”上午会议亮点汇总 代价究竟高不高,苹果为什么要在Android专利诉讼上花费2亿美元? 产品与设计专题论坛(下):App之美 产品与设计专题论坛(上):扁平还是拟物?产品说了算! 首届移动娱乐游戏峰会:中外手游的交锋与对抗(下) 研发人员超过500,基金会金牌会员,华为豪赌OpenStack New way of thinking:索尼SmartWatch 2应用开发马拉松大赛圆满结束 离了你地球照样转,谷歌地图并非苹果的必需品 面试必备的9大成功秘诀 Chuck Goldman:乔布斯从来不会说苹果不是企业应用的公司 全球最大的图片社交分享网站Pinterest发布首个API UX设计程序的五个谬论 研发周报:2013年美国开发者薪资调查报告 【开源推荐】PredictionIO:构建预测功能的机器学习服务器 只需4步 百度SiteApp助力京华网移动版落地 Windows Azure开放公测5个月的收获 RDS添加PostgreSQL支持 几家欢喜几家忧 首届智能硬件峰会:解读硬件创业机遇与挑战(下) 平台与技术专题论坛(二):游戏开发实践分享及IE11新体验 看Twitter上市后的入职面试题 六届中国大数据技术大会PPT精粹(三) AMD推多款异构计算开发工具 着力打造APU软件生态系统 Ceylon 1.0发布:又一个“Java语言替代品”? HTML5开发工具:英特尔XDK New 请教大师 这是所谓的“情”吗?谁碰到过如此谎谬的事~~“我们这样算什么?!” 分值,就那么重要吗?大家来探讨一下! 请问如何用TC或BC或VC实现字符界面下文本阅读器(请尽快复) lemonade请进 请教水平考试 请赐教如何制作WINDOWS下的电子行程表(请尽快复) 号外!!号外!!谁能认真点回答我这个问题? 学了C和JAVA以后,我该学哪中语言? 这么晚了,还有谁在水园? 如何用JSP实现聊天是中的自动滚屏功能? 我的FlashGet,NetAnts全都没有办法下载了!!!急死我了!!! 探讨用专业论坛和新闻组来促销,那位兄弟有经验? 一个简单的问题,大家来看罗。 如何禁止EDIT控件输入? To:pbdesigner兄弟没找到解决的办法,只好修改程序流程避开这个问题8-( 小弟该如何学习? Actinia在吗?问你个问题! 今天又有人送分,he he! VC快玩完了!!!!改学BCB!!!! 一个简单的问题,关于cin的 怎样向listview发送消息? N人上班,按照白、夜、休三班倒,如何每月按此顺序自动排班 TreeView接点如何响应单击事件? 我的一本c++教程,刚刚下载了练习答案,不会用, 请问这是个什么东东问题?(只有这么多分了。。) 一张表内关键字如何互换? 本人想插入一个记录,但该记录的一个字段是一个已经输入的值,你说该用什么函数处理呀?本人想了一个早上也想不出个原因来!!!! 今天真热,一大早爬起来去游泳,感觉真好。这里有喜欢早晨去游泳的吗? DCOM问题。Win2000下的服务器应怎样配置,才能使客户机调用服务器端的DCOM。 再不帮我我就死定了 我要哭了! 痛苦:如果你的头儿叫你帮他修改他写的一大段垃圾代码,你会怎么做办? 工程为什么不能打包? 高手快来。 请问怎么安装PB 那有Acrobat下載,不是Acrobat Reader Foxpro的ODBC,是不是真的就不支持update当前游标的记录....? 怎么在SQLSERVER2K里用存储过程得到的完整的Xml文件,我想用jsp取出来? 关于ASP 能否将文件编译程序中。 请问大家用delphi都做过哪些软件呢?能否提供下载以便欣赏呢?(无源码也可) 这是怎么回事,前几天我用BCB作了一个特殊的窗体,为什么现在我一运行一个程序所出现的窗口就是那个特殊的窗口即便是刚起动起系统也这样为什么? 为什么VB6通过ODBC方式访问一些数据库表(如本地的SQL Anywhere5或服务器端的Sybase11.5)时,只能作查询操作,不能作修改删除操作? 请问:哪里有htmlhelp的使用资料啊? 基于对话框的MFC Application, 辅助线程负责串口通信,希望在完成一个块的交换后用一个消息通知主线程,怎么做? 蝈蝈! 搜索时总是得到这个: 想去泡吧,给点建议先... 用ADO如何判断一个表或视图是否存在?高分给出解决问题者! 我有一个好友想学VB 希望得到你的帮助 IE 自动刷新?? 请大家帮忙把这篇文章翻译为英文 谢谢!从下周一开始,员工食堂关闭一周,进行重新装修.上午和下午在一楼接待厅将有餐饮公司使用推车提供饮料和三明治.附近的饭店每天中午12点到一点为 英语翻译清朝以前.(不要用任何在线翻译 ) 英语翻译黑龙江省 依安县 西门里 建行综合楼 底商4号 英语翻译Burn fat in an amazingly efficient 9-minute workout.•Uncover your "lost" abs without crunches 24 hrs a day.•Get back into good shape working out just 2 days a week.•Drop 15 pounds and also shave 4 inches off your waist i 英语翻译从前,有一只小兔子.它有一支漂亮的铅笔.它把这支铅笔装在一个铅笔盒里.有一天,小兔子打开铅笔盒,发现铅笔不在了.它伤心的哭了起来.过了几天,小狗捡到了这支铅笔,并到处询问这 求大家帮忙把中文地址翻译成英文!谢谢啦!深圳市盐田区沙头角海景二路蓝郡广场海蓝4单元6楼E号麻烦有没有高手帮我翻译成英文地址,谢谢! 英语翻译It's impossible to keep in good health unless we take sufficient recreation.The mind,too.requires change to make it acute and rigorous.There is much truth in the old saying,"All work and no play makes Jack a dull boy."There are many games 英语翻译①我要两张往返车票.②他们正在设法修理它.③我们还在吃午饭,你吃过了吗?④我刚吃过午饭,半小时前吃的.⑤几天前,我把一只手提箱落在开往伦敦的火车上了. 英语翻译我要填写一份表格.但是在地址那一栏要写英文.有个地址不知道应该怎麼翻译啊.广州市北较场横路12号物资大厦 英语翻译福清市佳惠交电贸易有限公司 (交电是摩托车和电器的意思) 英语翻译对不起,二妹 我所做的一切很伤害你吧.你很恨我吧.但是我还是希望你能忘记我.我所做的一切 就是让你不在爱我.以后还有很多辉煌的人生等着你,而我只是在你人生路过而已,设置慢 英语翻译四川省成都市高新区天府大道天府软件园A7栋3层 英语翻译公司名称:天美健国际健康科技(北京)有限公司天美健是公司名称,天美健能音译一个英文名称吗. 英语翻译临安自动化机电设备有限公司,临安市杨岱路33号翻译成英语怎么说?要正规的. 英语翻译石化木-------可仿真名贵木材、石化效果,纹理细腻、逼真高贵,任意造型、曲面、无接口(宽度1.2米以内),环保、防水、阻燃可达国家A级/欧盟VO级.生态石------可仿真名贵玉石,纹理细 英语翻译公司名称:天美健国际健康科技(北京)有限公司天美健是公司名称,天美健能音译一个英文名称吗. 英语翻译工作年限:三年以上 手 机:xxxxxxxxxx居 住 地:苏州 电子邮件:xxxxxxxxx学 历:本科 专 业:工业与民用建筑 性 别:男 出生日期:1984年9月29日 目前年薪:4万人民币 户 口:南京 身 英语翻译作为样品免费寄出请翻译下, 英语翻译中文名称为:富平县百斯特绿色农业有限责任公司请帮我翻译一下,百思特应该翻成“baisite”还是“best”呢? 英语翻译自我评价自从步入社会我就把饱满的热情投入到工作中,并具有“干一行,爱一行”的敬业精神.现在我想换一个更有发展、更能提升自我的单位.我就是一匹千里马,执着地追寻着一位 英语翻译北京市劳动局9:00开门办公,咱们9:00在劳动局门口见面.劳动局开车到出入境大约需要三十分钟(如果不堵车的情况下).在出入境办理大约需要一个小时,因为有时候人多需要排队. 英语翻译公司名是 四川兴亿成智能消防设备有限公司 英语翻译白宫的基址是美国开国元勋、第一任总统乔治·华盛顿选定的,始建于1792年,1800年基本完工.有趣的是,第一位入主白宫的总统并不是第一任总统华盛顿,而是第二任总统约翰·亚当斯; 英语翻译我向大船公司了解过,此份文件可以于离开中国境内2天到10天内办理,不一定会有罚金.请贵司尽快办理,我们下次一定会改进, 英语翻译公司名字需要翻译成英文 :哲思文化传媒(北京)有限公司 ,直接翻译成Zhesi culture media (Beijing) Co.,Ltd.或者在线翻译了一下The philosophy of culture media (Beijing) Co.,Ltd.、 Philosophy culture medi 英语翻译自我技能简介我的主打菜肴是 广东菜 四川菜 东北菜为主会做烤鸭以及各种广式点心(水晶虾饺 灌汤蟹黄包…………………………………)擅长把中国菜融入到地方风味,对自助餐, 能把这首歌翻译成英文吗早知道 你只是飞鸟拥抱后 手中只剩下 羽毛当初你又何必浪费那么多咖啡和玫瑰 来打扰我想要 安静地思考天平上 让爱恨不再 动摇一想你就平衡不了我关灯还是关不 英语翻译广州市亚太华桑贸易发展有限公司 怎么翻译呢 英语翻译I am writing to check if you like to go further on me with my background information.I graduated from Eastern China Normal University in 85 with a BS in economics.then hold a teaching position in business school/Shanghai University for ab 英语翻译Please provide the below missing information by return.1 Type of ownership:Private/ Partnership/ Family Owned/ Publicly Owned/ Subsidiary/ Wholly Owned2 no.of worker:only 16 workers in factory?3.Financial Details:please fill in the estima 英语翻译There were white lines around it,and it had a small black board saying:"Only for Head of Collage" 英语翻译中亚(天津)新材料科技有限公司要美观、准确,作为建筑前的铭牌装饰,全大写字应该怎样翻译美观, 英语翻译自我评价 熟悉计算机操作,熟练使用WINDOWS OFFICE办公软件.性格开朗、思维敏捷,善于总结分析.工作认真负责,且具备优秀的表达能力.适应能力强,很快可以融入环境,具有良好的团队协 英语翻译他的爸爸是日本人妈妈是美国人他的爱好是打篮球他想加入体育社团他会说英语也会说汉语他最喜欢的明星是迈克尔杰克逊他会弹钢琴还会唱歌和跳舞他也会弹吉它他真是一个多才 英语翻译自己注册了一个公司明年开业,全称是“上海景承广告有限公司”,求大神帮我翻译一下全称.最主要的是景承怎么翻译比较上口,也符合西方特点及读法,易于记忆上口,没有歧义.比如百 上海世博会英文简介 翻译成中文The World Expo in 2010(2010年世博会) The World Expo in 2010 Shanghai will host the 2010 World Expo. The World Expo has a long history but it has never been held in Asia. So the 2010 World Expo 求一篇关于计算机的文章,要有英语翻译.急 英语翻译河北国控金石矿业HeBei State Controlling JINSHI Mining Co,Ltd 金石是我们公司的名称 河北国控是我们总公司的名称 英语翻译• Taking charge of marketing promotion,establish effective communication with main construction companies in UAE.Planning and carrying out advertising and promotion resources.• Providing guideline to market support function,in 英语翻译如果我们能回到从前如果时间倒流如果她没有说要回来如果你没有回去找她或者说你回去了没有找她如果过年你对我说的话都做到了如果我没有犯错如果你留我了如果你和她的一切 公司英文名称翻译公司名称: 技想科技 要求: 1、将技想转成英语 2、赋予新的含义也行 3、简短有力,意义丰富 4、通俗易懂,得体合意. 请给出名称,并注明解释 公司是电子行业,外贸为主. 注 英语翻译我的姓名是XXX,出生在广州!我的工作时设计排版!我的爱好是收藏,邮票,钱币,球星卡.最大的希望是开一间邮币卡店结交天下有收藏爱好的朋友!我的星座是双鱼座.性格有点双面,对着朋 英语翻译我和我的同伴为大家表演3个魔术.我负责解说,XX来表演.那么,现在就开始了.第一个魔术:大家注意好,这是一副扑克牌.大家可以随意检查,接着我们需要一位观众配合,谁愿意上来?··· 英语翻译公司名称:技想科技 要求:1、将技想转成英语 2、赋予新的含义也行 3、简短有力,意义丰富 4、通俗易懂,得体合意.请给出名称,公司是电子行业,外贸为主.注明含意, 英语翻译2007年10月-2011年10月 担任职位:跟单部主管及采购部主管 主要负责:制定及完善本部门的ISO程序文件,根据公司实情编制及优化工作流程主持采购部全面工作,认真监督检查各采购员 翻译英语短文 请大家帮忙,谢谢INDIGOThe process of using.indigo dye to enrich clothing creates an authentic,vintage look and rica color,This unique treatment has been applied to produce an enhanced appearance taken when wearing with light 英语翻译Food and cooking Bananas are eaten deep fried,baked in their skin in a split bamboo,or steamed in glutinous rice wrapped in a banana leaf.Bananas can be made into jam.Banana pancakes are popular amongst backpackers and other travelers in 个人简历翻译成英文,急、 英语翻译We are keeping an ambitious expansion plan in China.You have an opportunity for a fast career,you will join us at RESPONSIBLE TRAINEE level and we will be looking to develop you quickly into a section manager,department manager or store m 英语翻译let it be your reminder,if you still need one,that no one ever makes it alone.请帮忙分析句子结构并翻译一下, 英语翻译Databases are usually designed to manage large bodies of information.This involves definition of structures for information storage(data modeling),provision of mechanisms for the manipulation of information(file and systems structur 精彩的文章翻译成英文同样好么 英语翻译Abstract:Jar tests were conducted to investigate the performance of enhanced primary treatment processes for low·concentra—tion municipal wastewater行om South China by using composite flocculant combined with bio.flocculants Pullu 麻烦大家帮忙把这段英文翻译成中文,谢谢了!China offers a good setting to test the relation between market institutions andaccounting properties because the levels of market development and governmentintervention vary significantly ac 请大家帮忙把文章翻译成英文`希望大家帮忙翻译下`单词要熟悉的`不要太生僻的`最好多用写句式`如定语,宾语从句之类的```23号之前翻译好!文章的地址http://hi.baidu.com/5lovewill/blog/item/19a72efbe300 英语翻译周六周日不用上班,所以我想表达的意思是“周末这两天可以休息咯!”英文该怎么说好呢? 中文地址翻译成英文!帮帮我!贵州省黎平县第一中学高三八班 陈利蓉 收 邮编557300 请大家帮忙把下面的这段文字翻译成英语谢谢大家了我非常高兴站在这里演讲.今天我想介绍一个人.他是我生命中一个重要的人.我们是在小学的一次打架后认识的.我们已经认识了10年了.小时 英语翻译“我想尽量让你觉得我过得很好,真的不用担心我,我会很开心的” 英语翻译北京市朝阳区壹线国际惠泽园10号楼1单元501室地址稍微有些变动:北京市朝阳区通惠家园惠泽园10号楼1单元501室把壹线国际改成通惠家园
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn