《c语言从入门到精通》看书笔记——第11章 结构体和共用体

来源:互联网 发布:macbook pro适合编程吗 编辑:程序博客网 时间:2024/06/01 14:45
1、结构体:
    “结构体”是一种构造类型,它是由若干“成员”组成的,其中的每一个成员可以是一个基本数据类型或者有事一个构造类型。
     (1)声明结构体时使用的关键字是struct,其一般形式为:
     struct 结构体名
     {
          成员列表
     };
     注意:在声明结构体时,要注意大括号最后面有一个分号“;”,在编程时不要忘记。
     例如:声明一个结构体Product
     struct Product
     {
            char cName[10];     //产品名称
           char cShape[20];     //形状
           int iPrice;      //价格
          char cArea[20];     //产地 
     };
     上面声明的结构体类型product,在结构体中定义的变量是结构体Product的成员,这些变量可以根据结构体成员中不同的作用选择与其相对应的类型。
     (2)结构体变量的定义
          声明一个结构体表示的创建一种新的类型名,要用新的类型名再定义变量。定义有三种方法:
          1)声明结构体类型,再定义变量。
               例如:sTruct Product product1;
               技巧:为了使规模较大的程序更便于修改和使用,常常将结构体类型的声明放在一个头文件中,这样在其他源文件中如果需要使用该结构体类型则可以用#include命令将该头文件包含到源头文件中。
          2)在声明结构体类型时,同时定义变量。
               一般形式为:
               struct 结构体名
               {
                    成员列表;
               }变量名列表;
               可以看到,在一般形式中将定义的变量的名称放在声明结构体的末尾处。
          3)直接定义结构体类型变量。
               一般形式为:
               struct
               {
                    成员列表
               }变量名列表;
2、结构体变量的引用
     结构体变量的引用不能直接将一个结构体变量作为一个整体进行输入和输出。
     要对结构体变量进行赋值、存取和运算、实质上就是对结构体成员的操作。结构体变量成员的一般形式为:
          结构体变量名.成员名
     在引用结构体成员时,可以在结构的变量名的后面加上成员运算符“.”和成员的名字。例如:
          product1.cName="lcebox";
     注意:但是如果成员本身又属于一个结构体类型,这时就要使用若干个成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行赋值或存取以及运算操作。
3、结构体类型的初始化
     例如:
     struct Student
     {
          char cName[20];
          char cSex;
          int iGrade;
      } student1={"HanXue","W",3};     //定义变量并设置初始值
     在初始化时要注意,定义的变量后面使用等号,然后将其初始化的值放在大括号中,并且每一个数据要与结构体的成员列表的顺序一样。
4、定义结构体数组(是整个结构体内的内容都定义为一个整体)
     定义一个结构体数组的方式与定义结构体变量的方法相同,只是结构体变量替换成数组。定义结构体数组的一般形式如下:
     struct 结构体名
     {
          成员列表;
     }数组名;
     这种定义结构体数组的方式是声明结构体类型的同时定义结构体数组,可以看到结构体数组和结构体变量的位置是相同的。
     就像定义结构体变量那样,定义结构体数组也可以有不同的方式。例如,先声明结构体类型再定义结构体数组:
          struct Student student[5];     //定义结构体数组
5、初始化结构体数组
     一般形式为:
     struct 结构体名
     {
          成员列表;
     }数组名={初始值列表};
     在定义数组student时,也可以不指定数组中的元素个数,这时编译器会根据数组后面的初始化值列表中给出的元素个数,来确定数组中元素的个数。例如:
          student[]={...};
6、结构体指针:一个指向变量的指针表示的变量所占内存中的起始地址。如果一个指针指向结构体变量,那么该指针指向的结构体变量的起始地址。同样指针变量也可以指向结构体数组的元素。
7、指向结构体变量的指针
     既然指针指向结构体变量的地址,因此可以使用指针来访问结构体的成员。定义结构体指针的一般形式为:
          结构体类型 *指针名;
     使用指向结构体变量的指针访问成员有两种方法,pStruct为指向结构体变量的指针。
     第一种方法:使用点运算符引用结构成员:
          (*pStruct).成员名
     结构体变量可以使用点运算符对其中的成员进行引用。*pStruct表示指向的结构体变量因此使用点运算符可以应用结构体中的成员变量。
          *pStruct一定要使用括号,因为点运算符的优先级是最高的,如果不使用括号,就会先执行点运算然后是*运算。
     第二种方法:使用指向运算符引用结构成员:
          pStruct ->成员名;
     第三种方法:使用结构体名点运算符引用结构成员
          student.成员名
     三种形式的效果是等价的,比如:
          student.成员名 === (*pStruct).成员名 === pStruct->成员名
8、在使用“->”引用成员时,要注意分析一下情况:
     (1)pStruct->iGrade,表示指向的结构体变量中成员iGrade的值。
     (2)pStruct->iGtade++,表示指向的结构体变量中成员iGrade的值,使用后该值加1.
     (3)++pStruct->iGrade,表示指向的结构体变量中成员iGrade的值加1,计算后再进行使用。
9、指向结构体数组的指针
     结构体指针变量指向结构体数组时,指针变量的值就是结构体数组的首地址。
     结构体指针变量也可以直接指向结构体数组中的元素,这时指针变量的值就是该结构体数组元素的首地址。例如定义一个结构体数组student[5],使用结构体指针指向该数组:
          struct Student* pStruct;
          pStruct=student;
     因为数组不使用下标时表示的是属猪的第一个元素的地址,所以指针指向数组的首地址。如果想利用指针指向第3个元素,则在数组名后附加下标,然后在数组名前使用取地址符号&,例如:
          pStruct = &student[2];
10、结构体变量做函数参数
     (1)使用结构体变量作为函数参数
          使用结构体变量作为函数的参数时,采取的是“值传递”,会将结构体变量所占内存单元的内容全部顺序传递给形参,形参也必须是同类型的结构体变量。例如:
          void Display(struct Student stu);
          在形参的位置使用结构体变量,但是函数调用期间,形参也要占用内存单元。这种传递方式在空间和时间上开销都比较大。
          另外,根据函数参数传值方式,如果在函数内部修改了变量中成员的值,则改变的值不会返回到主调函数中。
     (2)使用指向结构体变量的指针作为函数参数
          在传递结构体变量的指针时,只是将结构体变量的首地址进行传递,并没用将变量的副本进行传递。例如声明一个传递结构体变量指针的函数如下:
          void Display(struct Student* stu)
          这样使用形参stu指针就可以引用结构体变量中的成员了。
     (3)使用结构体变量的成员作为函数参数
          使用这种方式为函数传递参数与普通的变量作为实参是一样的,是传值方式传递。例如:
               Display(student.fScore[0]);
          注意:传值时,实参要与形参的类型一直。
11、数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被计算机程序识别和处理的集合。数据结构是指数据对象以及其中的相互关系和构造方法。有关线性表的连式存储结构称为链表。
12、链表:其存储元素个数是不受限制的,当进行添元素时,存储的个数就会随之改变。
     在链表中每个元素包含数据部分和指针部分。数据部分用来存放元素所包含的数据,而指针部分用来指向下一个元素,最后一个指针指向NULL,表示指向的地址为空。
     注意:在链表这种数据结构中,必须利用指针才能实现,因此链表中的节点应该包含一个指针变量来保存下一个节点的地址。
     例如:设计一个链表表示一个班级,其中链表中的节点表示学生:
     struct Student
     {
          char cName[20];     //姓名
          int iNumber;          //学号
          struct Student* pNext ;     //指向下一个节点的指针
     }
     当有新的节点要添加到链表中时,原来最后一个节点的指针将保存新添加的节点地址,而新节点的指针指向空(NULL),当添加完成后,新节点将成为链表的最后一个节点。
13、创建动态链表
     链表的创建过程是一个动态的创建过程,动态创建一个节点时,要为其分配内存。
     动态创建会用到的函数:
          1)malloc函数:在内存中动态的分配一块size大小的内存空间。malloc函数会返回一个指针,指向分配的内存空间,如果出现错误则返回NULL。
          void *malloc(unsigned int size);
          2)calloc函数:在内存中动态的分配n个长度为size的连续内存空间数组。calloc函数会返回一个指针,指向动态分配的连续内存空间地址,当分配出错时,返回NULL.
          void *calloc(unsigned n, unsigned size);
          3)free函数:使用由指针ptr指向的内存区,使部分内存区能被其他变量使用。ptr是最近一次调用calloc或malloc函数时返回的值。free函数无返回值。
          void free(void *ptr);
     所谓建立动态链表就是指在程序运行过程中从无到有地建立一个链表,即一个一个的分配节点的内存空间,然后输入节点中的数据并建立节点间的相连关系。
     
14、共用体的概念:
     共用体也称为联合体,它使几种不同类型的变量存放到同一段内存单元中。所以共用体子啊同一时刻只能有一个值,她属于某一个数据成员。由于所有成员位于同一块内存,因此共用体的大小就等于最大成员的大小。
     定义共用体变量的一般形式为:
     union 共用体名
     {
          成员列表
     }变量列表;
15、共用体变量的引用
     一般形式为:
     共用体变量.成员名;
     注意:不能直接引用共用体变量,如“printf("%d",variable);”
16、共用体变量的初始化
     对共用体变量初始化时,只需要一个初始化值就足够了,其类型必须和共用体的第一个成员的类型相一致。
     如果共用体的第一个成员是一个结构体类型,则初始化值中可以包含多个用于初始化该结构的表达式。
17、共用体类型的数据特点
     (1)同一个内存段可以用来存放几种不同类型的成员,但是每一种只能存放其中一种,而不是同时存放所有的类型。也就是说在共用体中,只有一个成员起作用,其他成员不起作用。
     (2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
     (3)共用体变量的地址和它的各成员的地址是一样的。
     (4)不能对共用体变量赋值,也不能企图引用变量名来得到一个值。
18、枚举
     利用关键字enum可以声明枚举类型,这也是一种数据类型。使用该类型可以定义枚举类型变量,一个枚举变量包含一组相关的标识符,其中每个标识符都对应一个整数值,称为枚举变量。
     例如定义一个枚举类型变量,其中每个标识符都对应一个整数值:
          enum Colors(Red,Green, Blue);
     注意:每个标识符都必须是唯一的,而且不能采用关键字或当前作用域内的其他相同的标识符。
     在定义枚举类型的变量时,可以为某个特定的标识符指定其对应的整型值,紧随其后的标识符对应值以次加1.例如:
          enum Colors(Red=1,Green,Blue);
          这样时,Red的值为1,Green的值是2,Blue的值是3
0 0
原创粉丝点击