C语言的指针和结构体ppt课件

上传人:资****亨 文档编号:135534235 上传时间:2020-06-16 格式:PPT 页数:39 大小:289KB
返回 下载 相关 举报
C语言的指针和结构体ppt课件_第1页
第1页 / 共39页
C语言的指针和结构体ppt课件_第2页
第2页 / 共39页
C语言的指针和结构体ppt课件_第3页
第3页 / 共39页
C语言的指针和结构体ppt课件_第4页
第4页 / 共39页
C语言的指针和结构体ppt课件_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《C语言的指针和结构体ppt课件》由会员分享,可在线阅读,更多相关《C语言的指针和结构体ppt课件(39页珍藏版)》请在金锄头文库上搜索。

1、 1 C语言中的指针与结构体 2 指针的概念 地址内容变量名 intx 20 y 1 z 155 int p p 指针变量 指针变量 存放地址的变量 某个变量的地址 指向 内存单元 3 指针变量所指向的变量的类型 int p p是整型指针 指向整型变量float fp fp是浮点型指针 指向浮点型变量char cp cp是字符型指针 指向字符型变量 类型名 指针变量名 指针声明符 指针变量的定义 4 取地址运算 和间接访问运算 间接访问运算符 访问指针所指向的变量 p 指针变量p所指向的变量 p 如果指针的值是某个变量的地址 通过指针就能间接访问那个变量 把a的地址赋给p 即p指向a 指针变量

2、的类型和它所指向变量的类型相同 5 1 当p 指针p所指向的变量 即a 改变变量值 3 p与 a相同 是地址 a与a相同 是变量 4 p 等价于a 将p所指向的变量值加1 p 等价于 p 先取 p 然后p自加 此时p不再指向a 说明 inta 3 p p 6 赋值运算 p1 p2 inta 3 p1 p2 p1 p2也指向a 相同类型的指针才能相互赋值 7 注意 指针变量必须初始化 voidmain inta 1 b 2 p1 p2 pt p1 a 1 b 2 p1 1 p2 2a 1 b 2 p1 2 p2 1 8 指针作为函数参数 voidswap int px int py intt t

3、 px px py py t 要通过函数调用来改变主调函数中某个变量的值 1 在主调函数中 将该变量的地址或者指向该变量的指针作为实参 2 在被调函数中 用指针类型形参接受该变量的地址 3 在被调函数中 改变形参所指向变量的值 swap 9 数组和地址间的关系 inta 100 p 数组名代表一个地址 它的值是数组首元素的地址 基地址 a i是距数组a的基地址的第i个偏移 sum 0 for i 0 i 100 i sum sum a i a i 下标运算符 的含义 10 任何由数组下标来实现的操作都能用指针来完成inta 100 p p a 或p a i a i a i a i p i p

4、i p i p i p a sum 0 for i 0 i 100 i sum sum p i 等价 等价 p i sum 0 for p a p 11 用指针实现内存动态分配 变量在使用前必须被定义且安排好存储空间存储空间分配分为两种 静态分配动态分配静态分配 全局变量 静态局部变量的存储是在编译时确定 在程序开始执行前完成 自动变量 在执行进入变量定义所在的语句时为它们分配存储 变量占用空间的大小也是静态确定的 12 动态存储分配 不是由编译系统分配的 而是由用户在程序中通过动态分配获取 使用动态内存分配能有效地使用内存使用时申请用完就释放 13 动态内存分配的步骤 1 了解需要多少内存空

5、间 2 利用C语言提供的动态分配函数来分配所需要的存储空间 3 使指针指向获得的内存空间 以便用指针在该空间内实施运算或操作 4 当使用完毕内存后 释放这一空间 14 动态存储分配函数malloc void malloc unsignedsize 在内存的动态存储区中分配一连续空间 其长度为size若申请成功 则返回一个指向所分配内存空间的起始地址的指针若申请内存空间不成功 则返回NULL返回值类型 void 通用指针的一个重要用途将malloc的返回值转换到特定指针类型 赋给一个指针 15 malloc 示例 动态分配n个整数类型大小的空间 if p int malloc n sizeof

6、int NULL printf Notabletoallocatememory n exit 1 调用malloc时 用sizeof计算存储块大小每次动态分配都要检查是否成功 考虑例外情况处理虽然存储块是动态分配的 但它的大小在分配后也是确定的 不要越界使用 16 动态存储释放函数free voidfree void ptr 释放由动态存储分配函数申请到的整块内存空间 ptr为指向要释放空间的首地址 当某个动态分配的存储块不再用时 要及时将它释放 17 分配调整函数realloc void realloc void ptr unsignedsize 更改以前的存储分配ptr必须是以前通过动态存

7、储分配得到的指针参数size为现在需要的空间大小如果调整失败 返回NULL 同时原来ptr指向存储块的内容不变 如果调整成功 返回一片能存放大小为size的区块 并保证该块的内容与原块的一致 如果size小于原块的大小 则内容为原块前size范围内的数据 如果新块更大 则原有数据存在新块的前一部分 如果分配成功 原存储块的内容就可能改变了 因此不允许再通过ptr去使用它 18 结构体 19 结构体的定义 结构体类型定义的一般形式为 struct结构名 类型名结构成员名1 类型名结构成员名2 类型名结构成员名n 关键字struct和它后面的结构名一起组成一个新的数据类型名 20 结构体的嵌套定义

8、 structaddress charcity 10 charstreet 20 intcode charzip 6 structlist charname 10 intsex intage structaddressaddr chartelephone 13 charemail 30 list 在定义嵌套的结构体类型时 必须先定义成员的结构体类型 再定义主结构体类型 21 结构体变量的定义和初始化 三种定义结构变量的方式 1 单独定义先定义结构体类型 再定义具有这种结构体类型的变量structlist charname 10 姓名 intage 年龄 chartelephone 13 联系电

9、话 structlistfriend1 friend2 22 2 混合定义在定义结构体类型的同时定义结构体变量structlist charname 10 intage chartelephone 13 friend1 friend2 3 无类型名定义在定义结构体变量时省略结构体名struct charname 10 intage chartelephone 13 friend1 friend2 23 结构体变量的初始化 structlistfriend1 Zhang 26 025 58736000 nameagetelephone 24 结构体变量成员的使用 结构体变量名 成员名friend

10、1 age 26 strcpy friend1 name ZhangSan strcpy friend1 addr zip 210044 25 structlist charname 10 intage chartelephone 13 friends 10 结构数组friends 它有10个数组元素 从friends 0 到friends 9 每个数组元素都是结构体类型structlist变量 结构体数组 26 结构体数组的初始化 structfriends listfriends 10 zhangsan 26 025 58736000 LiSi 30 13605732436 27 结构体数

11、组元素 结构数组元素的成员引用结构体数组名 下标 结构体成员名使用方法与同类型的变量完全相同friends 5 age 26 strcpy friends 5 name ZhangSan friends 4 friends 1 28 结构体指针 结构体指针 指向结构类型变量的指针结构体类型structliststructlistfriend1 zhang 26 025 58736000 structfriends list p p 29 结构体指针的使用 1 用 p访问结构成员 p age 26 2 用指向运算符 访问指针指向的结构成员 p age 26 当p 30 结构体指针作为函数参数 当

12、结构指针作为函数的参数时 执行效率高 可以完成比基本类型指针更为复杂的操作 例 输入10个学生的学号 姓名和成绩 输出学生的成绩等级和不及格人数 每个学生的记录包括学号 姓名 成绩和等级要求定义和调用函数set grade根据学生成绩设置等级 并统计不及格人数等级设置 A 85 100 B 70 84 C 60 69 D 0 59 31 源程序 defineN10structstudent intnum charname 20 intscore chargrade intmain void intcount structstudentstu N ptr ptr stu 输入略 count se

13、t grade ptr intset grade structstudent p inti n 0 for i 0 iscore 85 p grade A elseif p score 70 p grade B elseif p score 60 p grade C else p grade D n returnn 调用set grade返回主函数后 主函数中结构体数组stu的元素的grade成员已经被赋值 与结构体变量作为函数参数相比 用结构体指针作为函数参数的效率更高 因而是更好的选择 32 多文件结构 工作区 工程1 工程2 工程n 头文件 源文件 例 VC中的多文件结构 33 示例 i

14、nclude include include include 常量定义 defineLIST INIT SIZE100 defineLISTINCREMENT10 defineOK1 defineERROR0 defineOVERFLOW 2 defineTrue1 defineFalse0 函数返回值类型定义typedefintStatus 表节点数据类型定义typedefintElemType 顺序表类型定义typedefstruct ElemType elem intlength intlistsize SqList 顺序表各操作声明StatusInitList Sq SqList 头文

15、件 SqList h 34 include SqList h 各操作的实现StatusInitList Sq SqList 源文件 SqList cpp 35 intListEmpty Sq SqListL return L length 0 intListLength Sq SqListL returnL length StatusGetElem Sq SqListL inti ElemType 36 StatusListInsert Sq SqList 37 StatusListDelete Sq SqList 38 include SqList h voidmain SqListL in

16、ti num cout 创建顺序表 endl if InitList Sq L cout 表创建失败 创建空顺序表Lelse 产生各节点srand time NULL for i 0 i 10 i 产生10个整数 插入顺序表表尾num rand 100 ListInsert Sq L i 1 ElemType num 源文件 SqDemo cpp 包含主函数main 39 输出原始顺序表的各个值cout 生成的原始表为 PrintList Sq L 输出第2个节点的数据值GetElem Sq L 2 num cout endl 第2个元素值为 num endl 删除第2个节点ListDelete Sq L 2 num 输出修改后的顺序表的各个值cout 修改后的表为 PrintList Sq L cout endl

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号