sphao 发表于 2017-8-2 16:31

【笔记】第九章 构造类型(C语言)

本帖最后由 sphao 于 2017-8-3 17:45 编辑

第九章 构造类型
一 结构体类型
1. 构造结构体类型
   struct 结构体类型名
   {
          成员1的定义;
          成员2的定义;
          ......
          成员n的定义;
   };
注:
   (1)定义成员的方式与定义普通变量的方式一样
   (2)成员列表必须用一对花括号括起
   (3)结构体名可以省略
2. 定义结构体变量
   A. 先定义结构体类型名再定义结构体变量
   main()
   {
          struct student
          {
               int sn;
               int age;
               char sex;
               int s;
          };                                                   /*类型定义*/
          struct student stu1,stu2,st;    /*变量定义*/
   }
      B. 在定义结构体类型的同时可以定义结构体变量
   struct student
   {
          int sn;
          int age;
          char sex;
   int s;
   } stu1,stu2,st;
      C. 类型, 变量同时定义, 类型名student省略
   struct
   {
          int sn;
          int age;
          char sex;
          i nt s;
          int *p;
   } stu1,stu2,st;
注:
   结构体变量在内存中占用字节数为各成员占用字节数总和
3. 结构变量的初始化及引用
   (1)在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中, 来进行对结构体变量的初始化. 若初值个数多于成员个数则出错, 若初值个数少于成员个数, 则多余成员自动赋0
   (2)结构体变量不能整体引用, 只能引用它的成员(同数组相似)
   引用结构体成员的方式:
          结构体变量名.成员名
   其中(.)为成员运算符
4. 指向结构体数据类型的指针
   (1)指向结构体变量的指针
   可以用指针变量指向结构变量也可能用指针变量指向结构体变量中的成员. 要注意指针变量的类型必须与它所指向变量的类型相同. 当指针变量指向结构体变量时, 对指针变量加1则跳过整个结构体而不是跳过一个成员
   当指针变量p指向结构体变量aa时,引用aa中成员的方式有三种:
   aa.num
   (*p).num
   p->num -> 指向运算符
   aa.score
   (*p).score
   p->score
注:
   (1)可以用结构体变量的成员作为实参, 它与普通变量作为实参的用法是一样的
   (2)用结构体变量作为实参时,要求形参必须是同一结构体类型的变量, 传递后形参与实参各对应成员值是一样的
   (3)也可以用结构体类型的地址(指针变量或数组)作为实参, 要求形参必须是同一结构体类型的指针变量或数组. 只要是地址传递, 则可以通过形参来改变实参的值
二 链表
1. 链表概述
   链表是一种数据结构, 它采用动态分配存储单元方式. 它能够有效地节省存储空间(同数组比较)
   链表都有一个“头指针”变量(head),它用于指向链表中的第一个元素(即用于存放链表中第一个元素的地址). 链表中的元素称为“结点”, 链表中的所有结点都是结构体类型, 且同一链表中的结点都是同一结构体类型. 每个结点都应包括数据部分和下个结点地址两部分内容. 链表的最后一个元素(结点)称为链尾, 它不再指向其他结点(即该结点的指针成员值为NULL)
   链表的访问都是通过指针变量从头结点开始
   
   由于链表中的结点是一个结构体类型, 并且结点中有一个成员用于指向下一个结点. 所以定义作为结点的格式:
struct 结构体名
{
   定义数据成员;
   struct 结构体名 *指针变量名;
};
2. 动态存储分配函数<stdlib.h>
(1)malloc( )函数
   格式: malloc(size)
   作用是在内存的动态存储区中分配一个长度为size个字节的连续空间, 函数返回值为一个指向分配域起始地址的指针若分配失败则返回NULL。
例如: 开辟一个用于存放struct student数据的内存空间, 并让p指向该
空间:
   struct student *p=(struct student *)malloc(sizeof(struct student ));
(2)free( )函数
   格式: free(p);
   作用是释放用malloc( )分配的内存
3.链表操作
   (1)建立动态链表(假定若输入的成员为0则表示结束)
   (2)访问链表
   (3)链表结点的删除
a. 请将结点b从链表中删除(中间)
b. 请将结点d 从链表中删除(尾部)
c. 请将结点a 从链表中删除并让head重新指向链表的第一个结点
   (4)增加结点
a. 请将结点c插入结点之间, 形成新链表
b. 请将结点c插到已有链表的末尾
c. 请将结点c插到已有链表的前面
三 共用体类型
   共用体中的所有成员共用同一段内存(所有成员的起始地址都是一样
的)格式:
   union 共用体名
   {
          成员列表;
   };
注:
   (1)成员列表为定义该共用体的成员, 成员定义的方式与普通变量的方式   一样
   (2)成员列表必须用一对花括号括起
   (3)共用体名可以省略
1. 共用体变量的定义
   (1)先定义类型,再定义变量
   (2)定义类型的同时,定义变量
   (3)直接定义变量
注:
   由于共用体类型变量的所有成员都共用同一段内存,所以共用体类型变量所占的字节数等于该共用体类型中占用字节数最多的成员所占字节数
2. 共用体变量的引用
注:
   (1)不能整体引用共用体变量, 只能引用其成员
          格式: 共用体变量名.成员名
   (2)同类型成员共享值
   (3)在内存中整型数据的二进制数低8位占用前面一个字节,高8位
占用后面一个字节
   (4)共用体变量之间可以相互赋值, 赋值后两个变量应使用同一成员
   (5)共用体变量的地址与各成员的地址都相同的
   (6)在定义共用体时, 可以对其进行初始化, 但只能有一个初值且必须用花   括号将初值括起, 相当于给第一个成员赋值
   (7)共用体, 结构体的成员均可以是共用体或结构体类型
   (8)不能用共用体类型变量做为函数参数
   (9)计算共用体占用字节数
四 typedef
在编程中可以用typedef来定义新的类型名来代替已有的类型名
   格式:
   typedef 已有类型名 新的类型名;
   (1) typedef可用于定义各种类型名, 但不能定义变量. 即只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名
   (2)typedef只能对已经存在的类型新增一个别名,而不是创造新类型。即在typedef后必须是一个已有的类型



【笔记】第八章 指针(C语言)
http://www.52pojie.cn/thread-630294-1-1.html
【笔记】第七章 函数与预编译(C语言)
http://www.52pojie.cn/thread-629758-1-1.html
【笔记】第六章 数组(C语言)
http://www.52pojie.cn/thread-629287-1-1.html
【笔记】第五章 循环结构(C语言)
http://www.52pojie.cn/thread-628823-1-1.html
【笔记】第四章 选择结构(C语言)
http://www.52pojie.cn/thread-627932-1-1.html
【笔记】第三章 顺序结构(C语言)
http://www.52pojie.cn/thread-627411-1-1.html
【笔记】第二章 C语言组成及数据
http://www.52pojie.cn/thread-627006-1-1.html
【笔记】第一章 C语言基础知识
http://www.52pojie.cn/thread-626978-1-1.html







mayday0208 发表于 2017-8-2 17:22

感谢分享。马住慢慢看0.0

strnghrs 发表于 2017-8-2 17:59

为什么要把链表归结到与结构体、共用体在一起?这不是一个层次的东西吧?

fq645122 发表于 2017-8-2 18:33

路过路过

土匪小弟 发表于 2017-8-2 18:59

学习了,长知识了

努力的笨蛋 发表于 2017-8-2 19:10

厉害了,正好需要。省掉不少时间

aaa54 发表于 2017-8-2 21:21

同上,链表怎么在这里?不是同一层次的东西

徐思谦 发表于 2017-8-3 10:29

正好看到,学习学习..
页: [1]
查看完整版本: 【笔记】第九章 构造类型(C语言)