精华内容
下载资源
问答
  • (1)“数据类型说明符”说明了数组中各个元素存储数据类型。 (2)“数组名”是整个数组标识符,它取名方法与变量取名方法相同。 (3)“常量表达式”,常量表达式要求取值要为整型常量,必须用方括号...

     A. 数组

    一.一维数组

    一维数组只有一个下标,定义的形式如下:

    数据类型说明符  数组名[常量表达式][={初值,初值……}]

    各部分说明如下:

    (1)“数据类型说明符”说明了数组中各个元素存储的数据的类型。

    (2)“数组名”是整个数组的标识符,它的取名方法与变量的取名方法相同。

    (3)“常量表达式”,常量表达式要求取值要为整型常量,必须用方括号“[]”括起来。用于说明该数组的长度,即该数组元素的个数。

    (4)“初值部分”用于给数组元素赋初值,这部分在数组定义时属于可选项。对数组元素赋值,可以在定义时赋值,也可以定义之后赋值。在定义时赋值,后面须带等号,初值须用花括号括起来,括号内的初值两两之间用逗号间隔,可以对数组的全部元素赋值,也可以只对部分元素赋值。初值为0的元素可以只用逗号占位而不写初值0。

    例如:下面是定义数组的两个例子。

    unsigned  char  x[5];

    unsigned  int  y[3]={1,2,3};

    第一句定义了一个无符号字符数组,数组名为x,数组中的元素个数为5。

    第二句定义了一个无符号整型数组,数组名为y,数组中元素个数为3,定义的同时给数组中的三个元素赋初值,赋初值分别为1、2、3。

    需要注意的是,C51语言中数组的下标是从0开始的,因此上面第一句定义的5个元素分别是:x[0]、x[1]、x[2]、x[3]、x[4]。第二句定义的3个元素分别是:y[0]、y[1]、y[2]。赋值情况为:y[0]=1;y[1]=2;y[2]=3。

    C51规定在引用数组时,只能逐个引用数组中的各个元素,而不能一次引用整个数组。但如果是字符数组则可以一次引用整个数组。

    【例】用数组计算并输出Fibonacci数列的前20项。

    Fibonacci数列在数学和计算机算法中十分有用。Fibonacci数列是这样的一组数:第一个数字为0,第二个数字为1,之后每一个数字都是前两个数字之和。设计时通过数组存放Fibonacci数列,从第三项开始可通过累加的方法计算得到。

    程序如下:

    #include  <reg52.h>  //包含特殊功能寄存器库

    #include  <stdio.h>  //包含I/O函数库

    extern  serial_initial();

    main()

    {

    int  fib[20],i;

    fib[0]=0;

    fib[1]=1;

    serial_initial();

    for (i=2;i<20;i++)  fib[i]=fib[i-2]+fib[i-1];

    for (i=0;i<20;i++)

    {

    if (i%5= =0) printf(“\n”);

    printf(“%6d”,fib[i]);

    }

    while(1);

    }

    程序执行结果:

    0   1 1 2  3

    5     8   13 21    34

    55    89 144 233  377

    610 987 1597 2584  4148

    二.字符数组

    用来存放字符数据的数组称为字符数组,它是C语言中常用的一种数组。字符数组中的每一个元素都用来存放一个字符,也可用字符数组来存放字符串。字符数组的定义下一般数组相同,只是在定义时把数据类型定义为char型。

    例如:char  string1[10];

    char  string2[20];

    上面定义了两个字符数组,分别定义了10个元素和20个元素。

    在C51语言中,字符数组用于存放一组字符或字符串,字符串以“\0”作为结束符,只存放一般字符的字符数组的赋值与使用和一般的数组完全相同。对于存放字符串的字符数组。既可以对字符数组的元素逐个进行访问,也可以对整个数组按字符串的方式进行处理。

    【例】对字符数组进行输入和输出。

    #include  <reg52.h>  //包含特殊功能寄存器库

    #include  <stdio.h>  //包含I/O函数库

    extern  serial_initial();

    main()

    {

    char  string[20];

    serial_initial();

    printf(“please  type  any  character:”);

    scanf(“%s”,string);

    printf(“%s\n”,string);

    while(1);

    }

    B. 指针

    指针是C语言中的一个重要概念。指针类型数据在C语言程序中使用十分普遍,正确地使用指针类型数据,可以有效地表示复杂的数据结构;可以动态地分配存储器,直接处理内存地址。

    一.指针的概念

    了解指针的基本概念,先要了解数据在内存中的存储和读取方法。

    在汇编语言中,对内存单元数据的访问是通过指明内存单元的地址。访问时有两种方式:直接寻址方式和间接寻址方式。直接寻址是通过在指令中直接给出数据所在单元的地址而访问该单元的数据。例如:MOV  A,20H。在指令中直接给出所访问的内存单元地址20H,访问的是地址为20H的单元的数据,该指令把地址为20H的片内RAM单元的内容送累加器A;间接寻址是指所操作的数据所在的内存单元地址不是通过指令中直接提供,该地址是存放在寄存器中或其它的内存单元中,指令中指明存放地址的寄存器或内存单元来访问相应的数据。

    在C语言中,可以通过地址方式来访问内存单元的数据,但C语言作为一种高级程序设计语言,数据通常是以变量的形式进行存放和访问的。对于变量,在一个程序中定义了一个变量,编译器在编译时就在内存中给这个变量分配一定的字节单元进行存储。如对整型变量(int)分配2个字节单元,对于浮点型变量(float)分配4个字节单元,对于字符型变量分配1个字节单元等。变量在使用时分清两个概念:变量名和变量的值。前一个是数据的标识,后一个是数据的内容。变量名相当于内存单元的地址,变量的值相当于内存单元的内容。对于内存单元的数据访问方式有两种,对于变量也有两种访问方式:直接访问方式和间接访问方式。

    直接访问方式。对于变量的访问,我们大多数时候是直接给出变量名。例如:printf(“%d”,a),直接给出变量a的变量名来输出变量a的内容。在执行时,根据变量名得到内存单元的地址,然后从内存单元中取出数据按指定的格式输出。这就是直接访问方式。

    间接访问方式。例如要存取变量a中的值时,可以先将变量a的地址放在另一个变量b中,访问时先找到变量b,从变量b中取出变量a的地址,然后根据这个地址从内存单元中取出变量a的值。这就是间接访问。在这里,从变量b中取出的不是所访问的数据,而是访问的数据(变量a的值)的地址,这就是指针,变量b称为指针变量。

    关于指针,注意两个基本概念:变量的指针和指向变量的指针变量。变量的指针就是变量的地址。对于变量a,如果它所对应的内存单元地址为2000H,它的指针就是2000H。指针变量是指一个专门用来存放另一个变量地址的变量,它的值是指针。上面变量b中存放的是变量a的地址,变量b中的值是变量a的指针,变量b就是一个指向变量a的指针变量。

    如上所述,指针实质上就是各种数据在内存单元的地址,在C51语言中,不仅有指向一般类型变量的指针,还有指向各种组合类型变量的指针。在本书中我们只讨论指向一般变量的指针的定义与引用,对于指向组合类型的指针,大家可以参考其它书籍学习它的使用。

    二.指针变量的定义

    指针变量的定义与一般变量的定义类似,定义的一般形式为:

    数据类型说明符  [存储器类型]  *指针变量名;

    其中:

    “数据类型说明符”说明了该指针变量所指向的变量的类型。

    “存储器类型”是可选项,它是C5l编译器的一种扩展.如果带有此选项.指针被定义为基于存储器的指针。无此选项时,被定义为一般指针,这两种指针的区别在于它们占的存储字节不同。

    下面是几个指针变量定义的例子:

    int  * p1;       /*定义一个指向整型变量的指针变量p1*/

    char  * p2;      /*定义一个指向字符变量的指针变量p2*/

    char  data  * p3;      /*定义一个指向字符变量的指针变量p3,该指针访问的数据在片内数据存储器中,该指针在内存中占一个字节*/

    float  xdata  * p4;      /*定义一个指向字符变量的指针变量p4,该指针访问的数据在片外数据存储器中,该指针在内存中占两个字节*/

    三.指针变量的引用

    指针变量是存放另一变量地址的特殊变量,指针变量只能存放地址。指针变量使用时注意两个运算符:&和*。这两个运算符在前面已经介绍,其中:“&”是取地址运算符,“*”是指针运算符。通过“&”取地址运算符可以把一个变量的地址送给指针变量,使指针变量指向该变量;通过“*”指针运算符可以实现通过指针变量访问它所指向的变量的值。

    指针变量经过定义之后可以象其他基本类型变量一样引用。例如:

    int  x,* px,* py;      /*变量及指针变量定义*/

    px=&x;      /*将变量x的地址赋给指针变量px,使px指向变量x*/

    * px=5;      /*等价于x=5*/

    py=px;      /*将指针变量px中的地址赋给指针变量py,使指针变量py也指向x*/

    【例】输入两个整数x与y,经比较后按大小顺序输出。

    程序如下:

    #include  <reg52.h>  //包含特殊功能寄存器库

    #include  <stdio.h>  //包含I/O函数库

    extern  serial_initial();

    main()

    {

    int  x,y;

    int  * p,* p1,* p2;

    serial_initial();

    printf(“input  x  and  y:\n”);

    scanf(“%d%d”,&x,&y);

    p1=&x;p2=&y;

    if (x<y) {p=p1;p1=p2;p2=p;}

    printf(“max=%d,min=%d\n”,*p1,*p2);

    while(1);

    }

    程序执行结果:

    input  x  and  y:

    4  8

    max=8,min=4

    C.  结构

    结构是一种组合数据类型,它是将若干个不同类型的变量结合在一起而形成的一种数据的集合体。组成该集合体的各个变量称为结构元素或成员。整个集合体使用一个单独的结构变量名。

    一.结构与结构变量的定义

    结构与结构变量是两个不同的概念,结构是一种组合数据类型,结构变量是取值为结构这种组合数据类型的变量,相当于整型数据类型与整型变量的关系。对于结构与结构变量的定义有两种方法。

    1.先定义结构类型再定义结构变量

    结构的定义形式如下:

    struct  结构名

    {结构元素表};

    结构变量的定义如下:

    struct  结构名  结构变量名1,结构变量名2,……;

    其中,“结构元素表”为结构中的各个成员,它可以由不同的数据类型组成。在定义时须指明各个成员的数据类型。  

    例如,定义一个日期结构类型date,它由三个结构元素year、month、day组成,定义结构变量d1和d2,定义如下:

    struct  date

    {

    int  year;

    char  month,day;

    }

    struct  date  d1,d2;

    2.定义结构类型的同时定义结构变量名

    这种方法是将两个步骤合在一起,格式如下:

    struct  结构名

    {结构元素表} 结构变量名1,结构变量名2,……;

    例如对于上面的日期结构变量d1和d2可以按以下格式定义:

    struct  date

    {

    int  year;

    char  month,day;

    }d1,d2;

    对于结构的定义说明如下:

    (1)结构中的成员可以是基本数据类型,也可以是指针或数组,还可以是另一结构类型变量,形成结构的结构,即结构的嵌套。结构的嵌套可以是多层次的,但这种嵌套不能包含其自己。

    (2)定义的一个结构是一个相对独立的集合体,结构中的元素只在该结构中起作用,因而一个结构中的结构元素的名字可以与程序中的其它变量的名称相同,它们两者代表不同的对象,在使用时互相不影响。

    (3)结构变量在定义时也可以像其它变量在定义时加各种修饰符对它进行说明。

    (4)在C51中允许将具有相同结构类型的一组结构变量定义成结构数组,定义时与一般数组的定义相同,结构数组与一般变量数组的不同就在于结构数组的每一个元素都是具有同一结构的结构变量。

    二.结构变量的引用

    结构元素的引用一般格式如下:

         结构变量名.结构元素名

          结构变量名->结构元素名

    其中,“.”是结构的成员运算符,例如:d1.year表示结构变量d1中的元素year,d2.day表示结构变量d2中的元素day等。如果一个结构变量中结构元素又是另一个结构变量,即结构的嵌套,则需要用到若干个成员运算符,一级一级找到最低一级的结构元素,而且只能对这个最低级的结构元素进行引用,形如d1.time.hour的形式。

    【例】输入3个学生的语文、数学、英语的成绩,分别统计他们的总成绩并输出。

    程序如下:

    #include  <reg52.h>  //包含特殊功能寄存器库

    #include  <stdio.h>  //包含I/O函数库

    extern  serial_initial();

    struct  student

    {

    unsigned  char  name[10];

    unsigned  int  chinese;

    unsigned  int  math;

    unsigned  int  english;

    unsigned  int  total;

    }p1[3];

    main()

    {

    unsigned  char  i;

    serial_initial();

    printf(“input  3  studend  name  and  result:\n”);

    for  (i=0;i<3;i++)

    {

    printf(“input  name:\n”);

    scanf(“%s”,p1[i].name);

    printf(“input  result:\n”);

    scanf(“%d,%d,%d”,&p1[i].chinese,&p1[i].math,&p1[i].english);

    }

    for  (i=0;i<3;i++)

    {

    p1[i].total=p1[i].chinese+p1[i].math+p1[i].english;

    }

    for  (i=0;i<3;i++)

    {

    printf(“%s total is %d”,p1[i].name,p1[i].total);

    printf(“\n”);

    }

    while(1);

    }

    程序执行结果:

    input  3  studend  name  and  result:

    input  name:

    wang

    input  result:

    76,87,69

    input  name:

    yang

    input  result:

    75,77,89

    input  name:

    zhang

    input  result:

    72,81,79

    wang total is 232

    yang total is 241

    zhang total is 232

    D.  联合

    前面介绍的结构能够把不同类型的数据组合在一起使用,另外,在C51语言中,还提供一种组合类型--联合,也能够把不同类型的数据组合在一起使用,但它与结构又不一样,结构中定义的各个变量在内存中占用不同的内存单元,在位置上是分开的,而联合中定义的各个变量在内存中都是从同一个地址开始存放,即采用了所谓的“覆盖技术”。这种技术可使不同的变量分时使用同一内存空间,提高内存的利用效率。

    一.联合的定义

    1.先定义联合类型再定义联合变量

    定义联合类型,格式如下:

    union  联合类型名

    {成员列表};

    定义联合变量,格式如下:

    union  联合类型名  变量列表;

    例如:

    union  data

    {

    float  i;

    int  j;

    char  k;

    }

    union  data  a,b,c;

    2.定义联合类型的同时定义联合变量

    格式如下:

    union  联合类型名

    {成员列表}变量列表;

    例如:

    union  data

    {

    float  i;

    int  j;

    char  k;

    }data  a,b,c;

    可以看出,定义时,结构与联合的区别只是将关键字由struct换成union,但在内存的分配上两者完全不同。结构变量占用的内存长度是其中各个元素所占用的内存长度的总和;而联合变量所占用的内存长度是其中各元素的长度的最大值。结构变量中的各个元素可以同时进行访问,联合变量中的各个元素在一个时刻只能对一个进行访问。

    二.联合变量的引用

    联合变量中元素的引用与结构变量中元素的引用格式相同,形式如下:

    联合变量名.联合元素

    联合变量名->联合元素

    例如:对于前面定义的联合变量a、b、c中的元素可以通过下面形式引用。

    a.i;

    b.j;

    c.k;

    分别引用联合变量a中的float型元素i,联合变量b中的int型元素j,联合变量c中的char型元素k。

    E.  枚举

    枚举数据类型是一个有名字的某些整型常量的集合。这些整型常量是该类型变量可取的所有的合法值。枚举定义时应当列出该类型变量的所有可取值。

    枚举定义的格式与结构和联合基本相同,也有两种方法。

    先定义枚举类型,再定义枚举变量,格式如下:

    enum  枚举名  {枚举值列表};

    enum  枚举名  枚举变量列表;

    或在定义枚举类型的同时定义枚举变量,格式如下:

    enum  枚举名  {枚举值列表}枚举变量列表;

    例如:定义一个取值为星期几的枚举变量d1。

    enum  week  {Sun,Mon,Tue,Wed,Thu,Fri,Sat};

    enum  week  d1;

    enum  week  {Sun,Mon,Tue,Wed,Thu,Fri,Sat} d1;

    以后就可以把枚举值列表中各个值赋值给枚举变量d1进行使用了。

    展开全文
  • C语言-构造数据类型

    千次阅读 2017-07-27 18:52:16
    数组( C语言学习之数组 传送门)数组是同种类型元素集合。一维数组1.1 一维数组定义int a[10]; 这样我们便定义了一个数组a,它分配10个int类型空间。1.2 数组初始化我们可以在定义一个数组同时对它进行初始化...

    这里写图片描述

    数组

    ( C语言学习之数组 传送门)

    数组是同种类型元素的集合。

    一维数组

    1.1 一维数组定义

    int a[10];
    这样我们便定义了一个数组a,它分配10个int类型空间。

    1.2 数组的初始化

    我们可以在定义一个数组的同时对它进行初始化操作,例如:
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    甚至我们可以只对数组的部分元素进行初始化操作,例如:
    int a[10] = {1, 2, 3, 4, 5};

    这里我们只对数组的前5个元素做了初始化操作,剩下其它元素的值是未知的。

    如果我们对数组的所有元素都进行了初始化操作,那么我们甚至可以省略数组长度不写,编译器可以根据初始化数组元素的个数自动计算出数组的长度,但是写上总是好的,这样也便于其他人阅读和维护。
    int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    1.3 数组元素的访问

    访问数组中的元素可以采用数组名加下标的方式,下标是从0开始,c并不检查数组下标是否越界,所以在访问数组中的元素时需要注意,需要对数组下标做判断,防止访问数组越界。

    int a[10];
    
    int i;
    for (i = 0; i < 10; i++) {
          a[i] = i + 1;
    }

    二维数组

    2.1 二维数组定义

    int a[6][10];

    这样我们便定义了一个二维数组,这个数组是一个包含60个元素的矩阵,有6行10列。如何去看待一个二维数组,可以这样去看,先将a看成一个一维的数组,它有6个元素,但是它的每个元素又是一个包含10个元素的数组。

    关于二维数组在内存中的存储形式,例如一个3行6列数组它是这样的:

    2.2 二维数组的初始化

    同一维数组一样,可以对数组的所有元素进行初始化同样也可以只对数组的部分元素进行初始化。

    2.3 数组元素的访问

    还是数组名加下标的方式,不过下标有两个下标,一个是行下标,另一个是列下标,其它同一维数组没有什么两样。




    结构体

    构造函数类型 传送门
    C结构体用法 传送门

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

    对于结构体和共用体,C语言内存对齐是个值得一说的事情。

    内存对齐 传送门

    关于C中struct和union长度的详解 传送门

    1.1 结构中可以使用不同的数据类型。

    结构说明和结构变量定义
    在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此, x像其它类型的变量一样, 在使用结构变量时要先对其定义。
    定义结构变量的一般格式为:
    struct 结构名
    {
    类型 变量名;
    类型 变量名;

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

    类型为五种数据类型(整型、浮点型、字符型、指针型和无值型)。
    构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中元素是以下标来访问的, 而结构是按变量名字来访问成员的。

    struct MyBirthday {
    
        int year;
        int month;
        int day;
    };
    
    
    struct Person {
        char *name;
        int age;
        struct MyBirthday birthday;
        float bodyHeight;
    };
    

    1.2 结构变量的使用

    结构是一个新的数据类型, 因此结构变量也可以象其它类型的变量一样赋值、运算, 不同的是结构变量以成员作为基本变量。
    结构成员的表示方式为: 结构变量.成员名
    如果将”结构变量.成员名”看成一个整体, 则这个整体的数据类型与结构中该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。

        struct Person p = {"张三",28,{1993,9,21},180};
    
        printf("name=%s,age=%d,birthday=%d-%d-%d,height=%.2f\n",p.name,p.age,p.birthday.year,p.birthday.month,p.birthday.day,p.bodyHeight);
    
      //  name=张三,age=28,birthday=1993-9-21,height=180.00

    1.3 结构数组和结构指针

    结构是一种新的数据类型, 同样可以有结构数组和结构指针。

    1.3.1 结构数组

    结构数组就是具有相同结构类型的变量集合。
    假如要定义一个班级40个同学 的姓名、性别、年龄和住址, 可以定义成一个结构数组。

     struct{ 
          char name[8]; 
          char sex[2]; 
          int age; 
          char addr[40]; 
     }student[40]; 
    

    or

     struct string{ 
          char name[8]; 
          char sex[2]; 
          int age; 
          char addr[40]; 
     }; 
     struct string student[40]; 
    

    实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是 一个结构变量, 第二维是结构成员。

    1.3.2 结构指针

    结构指针是指向结构的指针。它由一个加在结构变量名前的”*” 操作符来定义,例如用前面已说明的结构定义一个结构指针如下:

         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. 结构的复杂形式 。

    1.3.3 结构的复杂形式

    一、嵌套结构

    嵌套结构是指在一个结构成员中可以包括其它一个结构, Turbo C 允许这种嵌套。

        struct addr{  
    char city[20];
    unsigned lon zipcode;
    char tel[14];
    }

     struct string{  
    char name[8];
    int age;
    struct addr address;
    } student;

    如果要给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语言详解 - 枚举类型 传送门

    枚举类型是比较简单的一种数据类型,事实上在C语言中枚举类型是作为整形常量进行处理的,通常称为“枚举常量”。

    1.1 新的数据类型

    enum Season{
        Spring,
        Summer,
        Autumn,
        Winter
    };

    (1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

    (2) Season是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。

    (3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。

    (4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

    (5) 枚举型是预处理指令#define的替代。

    (6) 类型定义以分号;结束。

    1.2 使用枚举类型对变量进行声明

        enum Season season= Spring; //枚举赋值,等价于season=1
        printf("season is %d\n",season);
        //season is 0

    1.3 使用枚举类型的变量

    3.1 对枚举型的变量赋值。

    3.2 对枚举型的变量赋整数值时,需要进行类型转换。

    3.3 使用枚举型变量

    1.4 枚举类型与sizeof运算符




    共用体 union

    共用体union的用法 传送门

    在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体。

    union Type{ 
    char a;
    short int b;
    int c;
    };

     printf("t.a=%d,t.b=%d,t.c=%d\n",t.a,t.b,t.c); 
    //结果:t.a=4,t.b=260,t.c=65796

    为什么t.a、t.b、t.c输出结果分别是4、260、65796,当然t.c等于65796并不奇怪,但是t.a前面赋值为’a’不应该是97吗,而t.b不应该是10吗?其实如果弄清这个问题共用体的概念基本就清楚了。
    根据前面提到的,共用体其实每次只能使用其中一个成员,对于上面的代码经过三次赋值最终使用的其实就是t.c,而通过上面的输出结果我们也确实看到c是有效的。共用体有一个特点就是它的成员存储在同一块内存区域,这块区域的大小需要根据它的成员中长度最大的成员长度而定。由于上面的代码是在64位编译器下编译的,具体长度:char=1,short int=2,int=4,所以得出结论,Type的长度为4,又根据上面输出的地址,可以得到下面的存储信息(注意数据的存储方式:高地址存储高位,低地址存储地位):
    这里写图片描述
    当读取c的时候,它的二进制是“00000000 00000001 00000001 00000100”,换算成十进制就是65796;而经过三次赋值后,此时b的存储就已经被c成员的低位数据覆盖,b的长度是二,所以从起始地址取两个字节得到的二进制数据此时是“00000001 00000100”(b原来的数据已经被c低2位数据覆盖,其实此时就是c的低2位数据),换算成十进制就是260;类似的a此时的数据就是c的低一位数据”00000100”,换算成十进制就是4。

    展开全文
  • C语言程序设计课程课件之第四章简单构造数据类型第四章 简单构造数据类型 目录 4.1 一维数组 4.2 二维数组 4.3 字符数组 4.4 数组与指针 4.5 数组及指针作为函数参数 4.1 一维数组 数组元素下标从0开始。...

    C语言程序设计课程课件之第四章简单构造数据类型

    第四章 简单构造数据类型 目录 4.1 一维数组 4.2 二维数组 4.3 字符数组 4.4 数组与指针 4.5 数组及指针作为函数参数 4.1 一维数组 数组元素的下标从0开始。例如:int a[5]; 其元素的表示为a[0]、 a[1]、 a[2]、 a[3]、 a[4]。 如果用a[5]则是错误的。 3、补充说明: ①、数组名由用户定义,命名规则和变量名相同。 ②、元素个数为常量表达式而不能是变量表达式。 如下错误:int n; scanf(“%d”,&n); int a[n]; ③、每一个元素相当于一个变量。 二、数组的编程使用特色 注意:对下标的引用不要超过下标的最大值。尽管超过最大值时不出现编译错误,但数组越界,取的是下一个单元的值,这个单元有可能存放的是其它的变量值,运算结果错误,甚至出现严重错误。 学生练习 定义一个长度为5的一维整型数组,将一个5位数的各个位存入该一维数组中,然后将各个位数逆序输出。 例:一个5位数为12345,将其各个位数求出来,并依次存入数组各元素中后,将各元素逆序输出,结果应该为54321。要求该数应由用户从键盘上输入。 三、一维数组初始化: 在程序运行之前,使数组各下标变量有一个初值。 1、在数组定义的同时对数组元素初始化。 int a[5]={1,2,3,4,5}; 2、可以仅对一部分下标元素赋初值。 如:static int a[5]={1,2,3}; 如果不对某些下标元素赋初值,则对于数值型元素初值均为0,对于字符型元素均为空操作符’\0’. 3、如果想对所有的元素全部赋初值,可以省略定义元素个数。如:static int aa[ ]={1,2,3,4,5}; 4.2 二维数组 4.3 字符数组与字符串 gets( )与scanf(%s)的区别: gets( )输入的字符串可含空格,而%s格式符输入的字符串不能包含空格,遇到空格、回车都认为是数据输入结束。 实际用gets( )的多。 4.4 数组与函数 4.4.2 用数组名作函数参数 用数组名作函数参数的本质 4.4 数组与指针 一个变量有地址,一个数组包含若干个元素,每个数组元素都在内存中占存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素。 所谓数组元素的指针就是数组元素的地址。 指向数组元素的指针变量的定义: 定义一个指向数组元素的指针变量的方法,与前面指向变量的指针变量相同,观察指针变量的赋值特征。 通过指针引用数组元素 用多种方法访问一维数组各元素 掌握这一部分在宗旨是:分清哪些表达是地址,当前地址是哪个元素的地址;哪些表达是元素,用地址引用元素最主要的特征是前面有“*”。 字符串与指针 用指针访问字符数组 用指针访问字符串常量 字符串指针作函数参数 对使用字符指针和字符数组的讨论 4.6.4 字符指针作为函数参数 函数设计的首部信息如下: 请写出main主函数调用该函数的程序 牢记黄色的方法 例如:int a[10],*p; p=a; ? p=&a[0]; 引用数组元素可以用下标法([]),也可以用指针法,即可以通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少、运行速度快) #include main( ){ int a[5], i ; for (i=0;i<5;i++) scanf(“%d”,&a[i]); for (i=0;i<5;i++) printf(“%d”,&a[i]);} #include main( ){ int a[5] , *p; for (p=a;p

    展开全文
  • C语言构造数据类型的初始化

    千次阅读 2013-12-14 12:58:21
    1. 数组静态初始化 我们都知道,一维数组静态初始化可以写成 int A[] = {1,2,3,4};其实,可以指定数组元素进行初始化,比如 int a[] = { [0] = 1, [1] = 2, [2] = 3 };这种技巧在某些情况下其实很有用:(1...

    1. 数组的静态初始化

    我们都知道,一维数组的静态初始化可以写成

    int A[] = {1,2,3,4};
    其实,可以指定数组元素进行初始化,比如
    int a[] = {
        [0] = 1, 
        [1] = 2, 
        [2] = 3
    };
    这种技巧在某些情况下其实很有用:(1)只想初始化数组中一些非连续的元素,其它元素都为0;(2)需要根据一组#define作为数组下标来保持某种映射关系的时候,就此我们举个例子。

    比如要定义一组错误码和错误码提示的字符串,我们可以用#define来定义错误码,将错误码作为错误提示字符串数组的下标,

    /* 错误码定义 */
    #define EINVAL  1
    #define ENOMEM  2
    #define EFAULT  3
    
    /* 错误提示字符串 */
    char *err_str[] = {
             [0] = "Success",
        [EINVAL] = "Invalid arguments",
        [ENOMEM] = "Not enough memory", 
        [EFAULT] = "Bad address"
    };

    对于这种情况,我们改变#define的值,都可以对err_str可以方便地不用做任何修改地使用索引。


    2. 结构体的静态初始化

    我们可以用字段名称对结构体进行初始化,这种方法在Linux内核源代码中使用非常普遍,比如

    static const struct file_operations mycdev_fops = {
    	.owner = THIS_MODULE,
    	.read = mycdev_read,
    	.write = mycdev_write,
    	.open = mycdev_open,
    	.release = mycdev_release,
    	.llseek = mycdev_llseek,
    	.unlocked_ioctl = mycdev_unlocked_ioctl,
    	.mmap = mycdev_mmap,
    };
    这段代码常用于字符设备驱动程序的设计中,owner、read等都是struct file_operations的成员变量(数据类型是函数指针),这里直接使用字段名称完成函数指针类型的结构体成员的初始化。

    再给个简单的例子,定义坐标,

    struct point {
        int x;
        int y;
        int z;
    }
    我们可以这样初始化struct point,

    struct point p = {.x = 3, .y = 4, .z = 5};

    这种使用字段名进行初始化的方法同样适用于union类型。





    展开全文
  • 复杂构造数据类型.ppt第五章 复杂构造数据类型,2/28,第五章 复杂构造数据类型,5.1 结构体 5.2 共用体 5.3 枚举类型,3/28,5.1.1 结构体引出及使用,每条记录中数据数据类型不相同,如何表示如下数据信息,结构体是...
  • c语言构造数据类型

    千次阅读 2015-08-30 11:02:01
     typedef:给老的数据类型取别名;可以简写复杂的数据类型;  */ typedef unsigned int ui; typedef int *pint;//pint是个类型,int *新名字; typedef int (*pfunc)(int ,int );//pfunc是个类型,表示函数指针...
  • C语言程序设计课程课件之第五章复杂构造数据类型第五章 复杂构造数据类型 结构体 与共用体 1 概述 在解决实际问题时,有时需要将多个不同数据类型组合在一起表达一个整体信息。 例如:描述一个学生完整信息时...
  • 一 数据类型 基本数据类型:byte,int ,char, float, ...构造数据类型:数组,结构体,共用体 指针类型 :指针 空类型 : void 二 基本数据类型特点 不可以再分解为其他类型,基本类型就是自我说明。 三 图解 ...
  • C语言中,数据类型分为基本类型、构造类型、指针类型和空类型void。其中基本类型又分为数值类型和字符类型;数值类型又分为整型和浮点型。构造类型又分为数组、结构体、共用体和枚举类型。对于一些基本类型(int、...
  • 第三章C语言的数据类型和表达式一、考试要点数据类型在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。1、数据类型分类1)基本数据类型基本数据类型最主要的特点是,其值不可以再...
  • 黑马程序员------<...Java培训、Android培训、iOS培训、.Net培训<...第五 复杂构造数据类型 01 结构体定义: 一般形式: struct 结构体名 { 类型标识符1 成员1; 类型标识符2 成员2; ...
  • PAGE / NUMPAGES 浅谈C语言002C语言数据类型 第一部分 C语言数据类型 数据是我们日常生活中经常见到的东西那么在C语言中也不例外 C语言的数据类型分为基本数据类型指针数据类型构造数据类型和空类型 在基本数据类型...
  • 目录基本知识框架课堂笔记基本知识框架Xmind文件下载 基本知识框架 课堂笔记 关于内置数据类型 整型数据:用于存储整数,至于short,...关于构造数据类型 数组类型:用于存储一组相同类型数据,数组成员只能是
  • C语言的数据类型

    2015-02-26 21:46:31
    2. 构造数据类型构造数据类型是根据已定义一个或多个数据类型用构造方法来定义。也就是说,一个构造类型值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。在...
  • C语言常用的数据类型

    2018-08-12 12:52:40
    C语言的数据类型更其不同的特点,可以分为基本类型,构造类型 和空类型,其中一类型都包含了其他一系列数据类型;指针和数组没有标识符。 基本数据类型 1.整型 1). 整型包括短整型(short int)、整型(int)和...
  • C语言的基本数据类型

    2016-11-16 17:55:00
    C语言允许使用的数据类型有三类。 (1) 基本类型。不可再分最基本的数据类型,包括整型、浮点(单精度)型、双精度型、字符型、无值类型、逻辑型及复数型。基本类型通常代表单个数据。 (2) 构造类型。由已知...
  • 第八章 构造类型 8.1 概述 8.2 结构体 8.3 定义结构体类型变量方法 8.4 结构体变量引用 8.5 结构体变量初始化 8.6 结构体数组 8.7 指向结构体类型数据指针 8.1 概述 在前面学习了一些基本的数据类型也叫简单...
  • C语言学习-数据类型

    2020-02-24 12:05:52
    C语言数据类型 1 C语言的数据类型分类 C语言的数据类型分为 基本数据类型: 整型int 字符型char 浮点型: 单精度浮点型float 双精度浮点型double 构造数据类型: 数组(如int a[]) 结构体struct 联...
  • C语言的基本数据类型与表达式

    千次阅读 2016-11-13 22:08:03
    数据的存储方式包括整数和浮点数,还有c语言的基本数据类型,包括基本类型,构造类型,指针类型(*),还有空类型,以及常量和变量还有运算符与表达式,以及数据的输入与输出。 其中基本类型包括逻辑类型,整数类型...
  •   其实学习C语言的时候有一件很头疼的事就是各种各样的数据类型,不同的场合不同的用途不同的数据要使用不同的数据类型,那又为什么要分出这么多种类型呢,因为类型决定了开辟空间的大小,开辟空间的大小又决定了...
  • C语言的数据类型

    2020-09-14 09:40:10
    C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。 1.基本数据类型 基本数据类型最主要特点是,其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明。 2.构造数据...
  • C语言中语序用户自己建立由不同类型数据组成集合型的数据结构,他称为结构体。相较于另一个数据集合数组而言,它可以存放不同类型的数据,但是数组只能存储相同类型的数据。 类似C++、Java中类。 1、声明...
  • C语言的数据类型C语言它是把高级语言的基本结构和语句与...2.构造数据类型构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。...
  • C语言的数据类型及其转换详解

    千次阅读 2018-09-15 18:49:18
    1. C语言的数据类型  C语言类型按其组成可以分为简单类型和构造类型,按是否预定义了类型名字和值集可以分为基本类型和非基本类型,按是否加了类型限定符可以分为限定类型和非限定类型。  ANS

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,603
精华内容 1,041
关键字:

c语言的构造数据类型

c语言 订阅