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

结构体与共用体-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则是在编译时完成的,后者更为灵活方便。

 

【BDTC讲师】杨强:从禽流感预测到图片语义解释 2013中国大数据技术大会讲师议题正式发布 “2013中国大数据周”即将开幕 正式发布中国大数据现状白皮书 搜狐畅游发布3D游戏引擎Genesis-3D 基于MIT协议开源 传闻微软将收购AOL旗下的Winamp和Shoutcast 【BDTC讲师】大数据时代“掘金机”:百度、360、一淘搜索技术分享 谷歌董事长:审查,将会在十年内消失 50万奖金+天使投资:创维天赐家庭互联网创新大赛开幕 专利案苹果获胜:获赔2.9亿美元 三星不服将继续上诉 Google正打造Spark:一个基于Chrome App的集成开发环境 研发周报:成为一名PHP专家其实并不难 将Vistual Studio打造成为Node.js IDE 度量Web性能的关键指标 路由器未火够!高通发布互联网处理器 Unite2014大会:移动开发者的饕餮盛宴 玩与学并存 Kano kit让你自制Raspberry Pi电脑 【BDTC讲师】Hortonworks Gunther&amp;amp;Ted:HBase、Stinger的发展与实践 人人网推出开放平台2.0 多项重大改进吸引开发者回流 红帽高管:将Linux价值理念和做法延伸到OpenStack Fundation 5发布:号称最快版本,响应式用户体验更完善 程序员远程工作必会编程语言JavaScript 苹果确认收购3D传感技术公司PrimeSense 从电影《饥饿游戏》里学到的IT知识 细数IE11的七大变化 2013中国大数据技术大会,你不可错过的10个理由 Unity 2D全球发布,开发者梦想照进现实 Kraken:改变PayPal开发文化的Node.js框架 微软高管:我们将不会再有三个Windows平台 中兴明年推智能手表 暂只能与自家手机搭配使用 移动开发必备!15款jQuery Mobile插件 Chrome新变化:在地址栏里增加搜索按钮 窗体导航的问题??????????????? 客户端socket连接时间长了之后,客户端锁死.请大家帮帮忙 创建设备相关的函数CreateDIBitmap的为什么需要HDC参数 关于DataSet的讨论.......... 如何用系统参数 关于条形码 怎么加入member variable我是新手 我在我的程序上作了一个exit按钮,用来关闭程序,用哪个函数好啊? 怎么样实现EDIT的从右到左的输出 小弟我最近用C++编程遇到了一个棘手的问题,就是图像的旋转和对比度调整,恳请各位大虾救我! 请问:一台w2k server的服务器安装了exchang sever w2k 如何实现用户自行更改PW。(次服务器在internet上)... 加载位图的问题 DB2 里用SQL建立一个数据库怎么写? 关天条形码 救命啊,我的.net怎么安装不上去啊? IP地址怎么倒着显示? 如何制作象微软网页那样的下拉菜单? 如何给表增加外键? 想下面我声明的pbr该怎么释放? 请问我下载的扩展名为".001"的文件怎样浏览 我的机子上可能出现了病毒,怎么办 如何在apache 中用perl 关于Service Application 程序的调试 有关rs.absolutepage的问题,急! int 如何转换为TCHAR? 8分钟又一首 有谁用JAVA做过机房管理系统? 对csdn页面的一个提议 这样的方法怎么写?送500分 如何判断行尾,\r\n 关于翻译的问题 哪位知道用VB或VC实现WAV转成VOX的控件,或者是直接录音成VOX文件 请教群集服务器上数据库的连接问题 关于拷贝构造函数的问题!! 二两乾天只手擎,谁想到对得上的吗? 在一Bean中,我返回一ResultSet,那么在bean中无法关闭数据库连接了,该怎么办? 继承了TComboBox的WndProc后无法截获WM_CHAR消息为什么? ReleaseDC和DeleteDC有什么区别? TNMFTP编程下载时出现:socket send aborted请指教! 客户端用java,数据库为oracle,如oracle设置为某一字符集,此时在java中得到的字符是什么字符集? ★★★ASP页面奇慢无比,Html很正常。大家救救我吧!★★★ 哪位知道用VB或VC实现WAV转成VOX的控件或源程序,或者是直接录音成VOX文件 有个小程序,我出钱,谁想做? rs.close 与rs=nothing 有什么区别,应该怎样用比较好!! Outlook中便笺字体的设置问题 请问那里有.net的教程下载? delphi6中 Corba data object 中怎么用ado呢? 为什么总不行? 如何在pb中实现控制datawindow每页的打印条数? 哪位知道用VB或VC实现WAV转成VOX的控件或源程序,或者是直接录音成VOX文件 请教高手!恳请指点! 我有个小程序,我出钱,谁有兴趣做下? 一个长方体的油箱棱长之和100分米,宽为8分米,如果往这个油箱装满油,每升油重0•8千克. 波长为λ=0.1nm的伦琴辐射光子的质量为多少kg. 人的胃,肝脏,小肠在人体哪个部位 什么牌子的铸造蜡好?市面上各种铸造蜡的质量相差大吗?好的差的做出来的有什么区别?什么牌子的做出来效果好点呢?在网上搜到广州瑞晖生产的艺辉牌铸造蜡质量怎么样,算不算是好的? 光子和电子有相同的德布罗意波长,则它们的质量比是多少只给答案 数学题.怎么做?快点啊!方程,不等式 《古诗词中的色彩美》的阅读答案 请问缅甸人名:NAY MYO WIN 和 AUNG TUN LIN 还有 MYO THAN 应该如何发音, 光子能量e=hv此应如何理解并如何得出的. 铸造中射蜡的时候吹气的作用是什么,脱蜡剂的作用又是什么 请问Thum这个缅甸人名的发音是什么,缅甸人名发音有什么规律吗 有两箱果,已知甲的5分2与乙的3分2同样重,甲的7分3比乙的4分3轻1.5kg甲乙各几kg 古诗词中的色彩美 诗歌中的色彩对诗人而言有什么重要的意义? Swee Lin人名怎么翻译 光子的能量http://baike.baidu.com/view/9448.htm里面说到 光子 没有质量.根据E=mc^2此处质量m=0那不是E=0?没有能量? 古诗词中的色彩美.阅读理解.两题 ko myo aung这个名字怎么念的,缅甸的 光子能量块 古诗词中的色彩美运用了什么结构 数学题 不等式组的方程1.方程组 x+y=2k-3的解x>0,y2a的解集是-9 光子的能量从哪来从量子物理学来看...光子随时都在运动,那么光子的能量是从哪里来的?根据质能守恒,是不是宇宙的能是是一直在循环的? 打箱的意思和主要操作要求又有什么,那位大侠速度的回复下哈, 用方程或不等式做排水.(最初是有水的),每小时增加的水相同,每台水泵的排水能力相同.1台9h排完,2台3h排完,3台h排完? 光子的能量与什么有关 写一句珍惜时间的名言警句谁有? 波长1500nm的红外线和波长为0.15nm的X射线的光子的能量和动量 小明收了150千克芝麻,榨出芝麻油63千克,求芝麻的出油率? 设A种什锦糖的单价为a元每千克,B种什锦糖的单价为b元/每千克现有甲.乙两种什锦糖,均由A.B两种糖混合而成其中甲种什锦糖由10千克A种糖和10千克B种糖混合而成;乙种什锦糖由100元A种糖和100 现有浓度为20%的糖水 40克 再加入多少千克浓度为60%的糖水 可以得到浓度为44%的糖水 有含糖6%的糖水900克,要使其含量加大到10%,需加入糖多少克? 翻译缅甸文把这排缅甸文打给我 我想问一下,缅甸的首都是仰光还是内比都呢?缅甸的首都是仰光还是内比都呢? 光电效应中为什么每个电子只可以吸收一个光子的能量即使为什么 爱因斯坦的 光电效应方程不是 Ek=nHv-W0 请帮我翻译一下 缅甸文 为什么缅甸首都由仰光变为内比都?什么时候改的? 波长相同,电子和光子的能量有什么不同 英语翻译 缅甸的首都在哪里?是仰光还是内比都?地理书上的图例标注的仰光是城市、内比都是首都?可参考书上写的首都是仰光呐、怎么回事哈? 光电子动能和光子能量的区别 英语翻译 谁知道缅甸新的首都内比都的三位英文代码?点可以去到哪里呢?希望你们可以帮个忙~无限感激! 电子吸收光子一定是全部吸收能量?电子吸收光子时,是一次性吸收的,普朗克的理论里面,辐射放出能量是一份一份的,符合这句话……但是康普顿效应里面又说光子有动量,撞击后自己仍有动量, 英语翻译Bal top Mha paing sine kwint ma ya Mae Pyit see 1 khu Ko sample a nay nae Pae ka na tar paing sine kwint ya dal nga a Pyit ka soe loon par tal .Kyae kwal dal a Gyee Gyee...Lu 1 youth Ko narr lal poh so dar pyaw ya dal lwal pin Mae let twa 60克糖中加入多少克浓度为百分之30的糖水使其浓度为百分之50 名人格言填空.时间给—者留下智慧和力量,给—者留下空虚和懊悔. 不愧对今天的人,时间会对你—;丢失了今天的人,明天会给你__. 利用德布罗意关系式计算动能为100ev的电子的德布罗意波长 英语翻译1、请翻译这个公司名Myint Marlar Manufacturing Co.,Ltd.2、请翻译这个地址No.1235,Tun Aine Gyi Street,7 Block Hpaan T/S, 附加名人姓名的名人格言 能量为15eV的光子,被处于基态的氢原子吸收,使氢原子电离发射一个光电子,求此光电子的德布罗意波长.(能量为15eV的光子,被处于基态的氢原子吸收,使氢原子电离发射一个光电子,求此 一个长方体油箱装油80千克,每升油量0.8千克,这个长方体油箱地面积为10平方分米,那么没油的高度是多少分米 一些名人格言!谢谢~~~~(>_ 甲乙两种糖配成什锦糖,如果3千克甲种糖和2千克乙种糖配成的什锦糖比用2千克甲种糖和3千克乙种糖配成的什锦糖贵1.32元一千克甲种糖比1千克乙种糖贵多少元 缅甸的具体地理位置是? 关于环保的名人格言外国的 铸造用蜡属于什么蜡?做佛像时做模具用的铸造蜡,听人说是用过一次的废料,请问他的成分是什么,属于什么蜡. 光子的德布罗意波长为0.2nm,它的能量为多少?帮同学问的~ 下列器官中属于消化系统的是 A喉 B 肝脏 C 胃 D 心脏 古诗词中的色彩美阅读答案 配制什锦糖,营业员用进价10.8元/千克的奶糖,8.4元/千克的酥糖按2:3:1的比例配成什锦糖,然后按20%的利润定价.每千克什锦糖定价多少元? 肝脏是不是人体消化系统中最大的消化器官?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘