C语言第08章指针.ppt

上传人:max****ui 文档编号:6334208 上传时间:2020-02-23 格式:PPT 页数:70 大小:397.50KB
返回 下载 相关 举报
C语言第08章指针.ppt_第1页
第1页 / 共70页
C语言第08章指针.ppt_第2页
第2页 / 共70页
C语言第08章指针.ppt_第3页
第3页 / 共70页
点击查看更多>>
资源描述
第八章 指针 目录 8 1指针的概念 8 2指针变量的定义和引用 8 3指针与一维数组 8 4指针与字符串 8 5指针与多维数组 8 6指针数组与指向指针的指针 8 7返回指针值的函数 8 8指向函数的指针 8 9动态内存分配 8 10本章程序举例 本章要点小结 本章结束 8 1指针的概念 指针是C语言的一个重要概念 也是C语言的一个重要特色 深刻理解和正确使用指针是学习本章的基本要求 本章是一个难点 也是一个重点 初学者不易掌握 在理解和熟悉基本内容的前提下 上机实验是必不可少的环节 8 1指针的概念 一 地址 在计算机中 把内存区划分为一个一个的存储单元 每个单元为一个字节 位 它们都有一个编号 这个编号就是内存地址 如下图所示 注意 1 程序中定义的每个数据在编译后都占有各自的内存区 2 数据所占有的存储单元个数是由其类型决定的 3 首地址 第1个单元的地址4 表示地址的数与整数的区别 8 1指针的概念 二 举例 如有定义 charc A inta 3 则所占内存情况如下 注意 c和a的地址可能相邻 也可能不相邻 是由系统分配的 我们不用关心 8 1指针的概念 三 指针与指针变量 1 指针 简单地说 指针就是地址 二者是同一个概念的两种说法 只不过指针更形象一些 就像一个针一样 可以指向某个地方 2 指针变量 首先指针变量就是一个变量 和我们以前所讲的其它变量没有本质区别 不同之处在于这种变量中所存放的内容是地址 什么是指针变量呢 我们回忆一下什么叫整型变量 打个比方 8 1指针的概念 四 直接访问和间接访问 有两个上锁且放着物品的盒子A B 如果你有A盒子的钥匙 则可以直接打开A盒子将物品取出 如果你有B盒子的钥匙 而A盒子的钥匙在B盒子中 要想取出A盒子中的物品 则必须先打开B盒子 取出A盒子的钥匙 再打开A盒子将物品取出 上面两种情况就是直接访问和间接访问的概念 8 1指针的概念 1 直接访问 通过变量本身对变量进行存取的方式 称为直接访问 如定义 intx 则x 10 x 5 等等这种访问方式只需要变量本身就得到了该变量的全部信息 不需要其它内容 是直接的 8 1指针的概念 2 间接访问 通过指针变量实现对变量的访问方式 称为间接访问 首先要定义一个指针变量 然后将一个同类型变量的地址赋给该指针变量 这时我们称指针变量指向该变量 这样就可以进行间接访问了 间接访问的过程是 由指针变量得到变量的地址 根据该地址找到变量的存储区 再对该存储区的内容进行存取 从而实现了对变量的间接访问 8 2指针变量的定义和引用 一 指针变量的定义和赋值 1 格式 类型名 指针变量名 2 举例int p1 char s1 s2 float a1 a2 f 3 说明a 类型名 指针变量所指向的变量类型 b 是定义指针变量的标志 不可丢掉 c 指针变量定义后 其值是不确定的 8 2指针变量的定义和引用 4 赋值 可以进行初始化 也可以使用赋值语句 1 初始化 inta s 2 赋值语句inta s s 3 注意 只能用同类型变量的地址进行赋值 如定义 int s floatf 则s f 是非法的 不定 8 2指针变量的定义和引用 在分析有关指针的程序时 画图是很好的方法 若有 inta s 则 s a 若有 inta 5 s 则 不定 5 a 8 2指针变量的定义和引用 二 指针变量的引用 1 两个运算符 与 取地址 注意与作位运算符时的不同 双目 取内容 注意与作乘运算符时的不同 双目 2 说明a 既可作用于一般变量 也可作用于指针变量b 只能作用于指针变量c 定义指针变量时的 与该处的含义不同 8 2指针变量的定义和引用 3 指针变量可以进行的操作 1 赋值 inta p1 5 比较 与指针常量NULL进行比较 两指针变量值的大小比较无意义 表示空指针 即不指向任何单元 在头文件stdio h中定义 8 2指针变量的定义和引用 例8 1 includemain inta1 11 a2 22 int p1 p2 p1 举例 p1 a1 11 22 a1 p2 a2 a2 p1 p2 a1 8 2指针变量的定义和引用 例8 2 includemain inta1 11 a2 22 int p1 p2 p p1 p1 a1 11 22 a1 p2 a2 a2 p1 p2 a1 a2 举例 8 2指针变量的定义和引用 例8 3 includemain inta1 11 a2 22 t int p1 p2 p1 p1 a1 11 22 a1 p2 a2 a2 p1 p2 22 11 举例 8 2指针变量的定义和引用 三 指针作为函数的参数 1 形式 只需要形式参数名前加上一个 即可 如 voidtest int pointer charf char s 2 说明参数的传递是值传递 单向的 从实参到形参 那么如何理解通过指针作为参数可以改变主调函数中变量的值呢 形参得到实参的值 一个地址 函数中可以通过形参引用该地址 从而可以改变该地址对应变量的值 但如果形参本身改变了 其值不会传给时参 8 2指针变量的定义和引用 例8 4 includevoidtest int pt main inta 11 p 执行 例8 5 8 3指针与一维数组 在 语言中 指针与数组有着密切的关系 对数组元素 既可以采用数组下标来引用 也可以通过指向数组元素的指针来引用 采用指针方法处理数组 可以产生代码长度小 运行速度快的程序 8 3指针与一维数组 一 通过指针访问一维数组 1 数组结构的分析 设有数组定义为 inta 5 则有 1 a表示数组在内存中的首地址 也就是数组中第1个元素的首地址 它是一个地址常量 其值由系统在编译时确定 程序运行期间不能改变 2 数组中的各元素表示为 a 0 a 1 a 2 a 3 a 4 或者是 a 0 或 a a 1 a 2 a 3 a 4 8 3指针与一维数组 3 数组中的各元素的地址表示为 a 0 a 1 a 2 a 3 a 4 或者是 a 0 或a a 1 a 2 a 3 a 4 4 另一种解释 数组名是基地址 下标是偏移量 a i 就表示以a为基地址 偏移i个元素的那个元素 5 数组的逻辑结构如下 a a 0 a 1 a 2 a 3 a 4 8 3指针与一维数组 2 指针与数组的关系 现定义一个指针变量 int s 并进行赋值 s a 或s 则 指针变量s指向了数组a的开始 二者产生了联系 这样就可以通过指针变量s访问数组a了 a a 0 a 1 a 2 a 3 a 4 s 注意 a是指针常量 s是指针变量 8 3指针与一维数组 当然 对s也可以进行其它赋值 如 s a 2 或s 图变为 a a 0 a 1 a 2 a 3 a 4 s 说明 若进行操作s a s 2 效果与上述相同 8 3指针与一维数组 当一个指针变量指向数组的首地址后 关系图为 数组inta 5 指向数组元素的指针 指向数组元素的访问 a a 0 s s 0 a 1 a 1 s 1 s 1 a i a i s i s i a 0 a s 0 s a 1 a 1 s 1 s 1 a i a i s i s i 8 3指针与一维数组 3 一维数组的访问 例8 6用多种方法访问一维数组各元素 includemain inta 5 1 3 5 7 9 i p a for i 0 i 5 i printf d a i for i 0 i 5 i printf d a i for i 0 i 5 i printf d p i for i 0 i 5 i printf d p i for p a 5 p printf d p p a while p a 5 printf d p 8 3指针与一维数组 4 几个表达式的分析 设定义 inta 3 1 2 3 s a s sa as s a a s s a a 初始化时的 s a 与语句 s a 的不同一个指针变量加 减一个整数后 指针变量值的变化情况 8 3指针与一维数组 二 通过指针在函数间传递一维数组 1 函数的定义形式 例如 intfunc intarray intn 函数体 也可以写为 intfunc int pointer intn 函数体 8 3指针与一维数组 2 函数的说明形式 如有函数定义 intfunc intarray intn 函数体 则对该函数的说明形式可以写为 intfunc intarray intn intfunc int array intn intfunc int int intfunc int int 注意 作为形参定义的数组名是一个指针变量 它在函数体中可以变化 这一点与变量定义时不同 8 3指针与一维数组 例8 7编写在数组的最后一个元素中存放其它元素和的函数 includevoidsummary int p intn main staticinta 11 1 2 3 4 5 6 7 8 9 10 summary a 10 printf Sumis d n a 10 voidsummary int p intn ints 0 while n s p p s 函数还可写为 voidsummary intarr intn inti s 0 for i 0 i n i s arr i arr n s 8 4指针与字符串 字符串是一种特殊的一维数组 所以上节中介绍的方法同样适用于对字符串的访问 字符串的特殊性在于 字符串的末尾是结束标志 0 所以访问字符串时常用结束标志进行判断 8 4指针与字符串 一 通过指针访问字符串 1 字符串结构的分析 设有数组定义为 chars abcde 则s是一个字符数组 它里面存放的是一个字符串 它在内存中占用6个字节 但长度为5 其结构为 s s 0 s 1 s 2 s 3 s 4 s 5 结束标志 8 4指针与字符串 字符串还可以定义为 char s abcde 它在内存中占用6个字节 长度为5 其结构为 s s 0 s 1 s 2 s 3 s 4 s 5 结束标志 8 4指针与字符串 2 用字符数组与用指针使用字符串的比较 定义及初始化chars abcde char p abcde 赋值chars 6 char p s abcde 不对 应为 p abcde strcpy s abcde strcpy p abcde 使用s不能加 减p可以加 减注意 chars abc 与chars a b c 的区别 8 4指针与字符串 例8 8将字符数组a中的字符串拷贝到字符数组b中 1 下标法 2 指针法 include includemain main chara Hello world b 20 chara Hello world b 20 inti char pa pb for i 0 a i 0 i for pa a pb b pa 0 pa pb b i a i pb pa b i 0 pb 0 printf s n b printf s n b 该功能相当于 strcpy b a 8 4指针与字符串 二 通过指针在函数间传递字符串 1 函数的定义形式 例如 charfunc chara charb 函数体 也可以写为 charfunc char a char b 函数体 8 4指针与字符串 例8 10设计一函数 实现与标准函数strcpy类似的功能 includevoidmystrcpy char to char from main charca 20 cp Hello world mystrcpy ca cp printf s ca voidmystrcpy char to char from while from 0 to from to from to 0 while to from 思考 调用mystrcpy ca cp 2 结果如何 8 5指针与多维数组 数组是具有相同 数据类型 的数据的顺序集合 而数组本身也是 语言的一种数据类型 同样可以作为数组的元素类型 当一个一维数组的元素类型为数组时 便构成了多维数组 熟记下面两组等价式 x i x i x i x i 8 5指针与多维数组 一 通过指针访问多维数组 1 二维数组结构的分析 设有数组定义为 inta 3 4 则有 a表示数组在内存中的首地址 也就是数组中第1个元素 也是第一行 的首地址 它是一个地址常量 其值由系统在编译时确定 程序运行期间不能改变 该二维数组可以理解为 它是一个一维数组 含有3个元素 每个元素又是一个一维数组 该一维数组含有4个元素 每个元素是int类型 8 5指针与多维数组 二维数组的逻辑结构图如下 a 0 a 1 a 2 a 0 a 2 a 1 8 5指针与多维数组 2 指向二维数组中一行的指针变量 1 格式 类型名 指针变量名 长度 2 例如 int pa 4 3 含义 pa是指针变量 它指向一个数组 数组含有4个元素 每个元素的类型是int 4 说明 a 与定义int pa 以及int pa 4 含义不同 b 如果执行pa 则pa实际增加了多少呢 pa实际增加了2 4 8个字节 8 5指针与多维数组 c 若定义 inta 3 4 pa 4 a 则关系图为 a pa pa 0 pa 1 pa 2 pa 3 如果执行pa 则变为如图所示 pa pa 第一行各元素还可以表示为 那么 pa 0 pa 1 pa 2 pa 3 也变了 8 5指针与多维数组 3 几个表达式 由x i x i 和 x i x i可以得出 a i j a i j a i j a i j a i j a i j a i j 有关三维数组的内容 请参看教材152页 了解 8 5指针与多维数组 例8 11用各种方法访问二维数组各元素 includemain staticintaa 3 4 1 2 3 4 5 6 7 8 9 10 11 12 inti j p pa 4 第一种方法for pa aa i 0 i 3 i printf n for j 0 j 4 j printf 5d pa i j 8 5指针与多维数组 第二种方法for pa aa pa aa 3 pa printf n for j 0 j 4 j printf 5d pa j 第三种方法for p 8 5指针与多维数组 二 通过指针在函数间传递多维数组 1 函数的定义形式 例如 intfunc intarray 4 intn 函数体 也可以写为 intfunc int pa 4 intn 函数体 8 5指针与多维数组 2 函数的说明形式 如有函数定义 intfunc intarray 4 intn 函数体 则对该函数的说明形式可以写为 intfunc intarray 4 intn intfunc int pa 4 intn intfunc int 4 int intfunc int 4 int 注意 作为形参定义的数组名是一个指针变量 它在函数体中可以变化 这一点与变量定义时不同 8 5指针与多维数组 例8 12求3行4列二维数组中的最大元素 includeintmax value int pa 4 introw main staticintaa 3 4 1 3 5 7 2 4 6 8 20 15 32 12 printf maxelementis d n max value aa 3 intmax value int pa 4 introw inti j m pa 0 0 for i 0 im m pa i j return m 8 5指针与多维数组 例8 12求3行4列二维数组中的最大元素 另一种方法 includeintmax value int p intn main staticintaa 3 4 1 3 5 7 2 4 6 8 20 15 32 12 intmax max max value 8 6指针数组与指向指针的指针 一 指针数组 1 指针数组的概念 指针数组是一种特殊的数组 它每个元素的类型都是指针类型 即地址 其它与一般数组相同 当把某个量的地址放入某元素中后 即可通过该元素对相应的量进行间接访问 2 指针数组的定义 类型名 指针数组名 常量表达式 如 int ap 3 char s 10 等等 8 6指针数组与指向指针的指针 3 指针数组的初始化 1 inta1 5 a2 5 a3 5 ap 3 a1 a2 a3 2 char sp abc 123 Hello 4 指针数组的赋值 上面的情况中 可以先定义变量 在进行赋值 即 1 inta1 5 a2 5 a3 5 ap 3 ap 0 a1 ap 1 a2 ap 2 a3 2 char sp abc 123 Hello sp 0 abc sp 1 123 sp 2 Hello 例8 13显示多个字符串 includemain staticchar ap 3 CPU Computer Microprocessor inti for i 0 imain staticcharaa 3 15 CPU Computer Microprocessor inti for i 0 i 3 i puts aa i 以上用二维字符数组实现 8 6指针数组与指向指针的指针 两种方法中所占内存空间的比较 aa 0 aa 1 aa 2 ap 8 6指针数组与指向指针的指针 8 6指针数组与指向指针的指针 二 指向指针的指针 2 多级指针的定义 类型标识符 指针变量名 注 的个数代表级数 要求掌握到二级即可 如 char pp p ch A 又p 则 1 多级指针的概念 所谓多级指针 是指指针有多级指向关系 p ch A pp p ch 8 6指针数组与指向指针的指针 3 多级指针的含义 若定义 char ps abc 123 pp ps 则 pp为 abc pp 1 为 123 pp 1 2 为 3 执行pp 则 pp为 123 例8 14显示并选择菜单条目 includeintgetchoice char menu intn main intchc staticchar mn 5 1 Input 2 Copy 3 Move 4 Delete 0 Exit chc getchoice mn 5 if chc 0 8 6指针数组与指向指针的指针 intgetchoice char menu intn inti choice for i 0 i n i puts menu i printf nInputypurchoice return getchar 0 8 6指针数组与指向指针的指针 8 6指针数组与指向指针的指针 三 命令行参数 1 命令行参数的概念 1 DOS命令 copyfile1file22 以前的main函数形式 main 3 mian函数的调用由系统完成4 带参main函数 main intargc char argv 或main intargc char argv 或main intargc charargv 8 6指针数组与指向指针的指针 2 命令行参数的说明 1 形参也可以用其它名字 习惯上为argc和argv2 argc和argv的值得获得如有程序myprog c 经编译和链接生成可执行程序myprog exe 在命令行中输入 myprogargument1argument2则argc的值为3 argv 0 的值为 myprog argv 1 的值为 argument1 argv 2 的值为 argument2 3 实现 DOS提示符状态下或集成环境中 例8 15输出各命令行参数 includemain intargc char argv inti for i 1 i argc i printf arg d s n i argv i 若可执行文件为showarg 运行时键入 showargComputerandClanguage则输出为 arg1 Computerarg2 andarg3 Carg4 language 8 6指针数组与指向指针的指针 执行 8 7返回指针值的函数 1 概念 当函数的返回值是指针类型 地址 时 则称为指针函数 2 定义 类型名 函数名 形参表 如 int f inta 等等 例8 16将一个字符串转换为大写形式并输出 includechar mytoupper char s main charps 80 s gets ps s mytoupper ps puts s char mytoupper char s char t s while t 0 t t a 8 7返回指针值的函数 8 8指向函数的指针 1 函数名的含义 函数名代表一个地址 它是函数的入口 即函数代码在内存中的起始位置 数与指针常量 类似于数组名 2 概念 如果一个指针指向一个函数 则称该指针为函数指针 注意与指针函数的区别 3 定义 类型名 指针变量名 形参表 如 int f inta intb 例8 17函数指针举例 includeintmax inta intb intmin inta intb main intx 3 y 4 z int pf int int pf max z pf x y printf maxis d n z pf min printf minis d n pf x y intmax inta intb return a b a b intmin inta intb return a b a b 8 8指向函数的指针 8 9动态内存分配 由变量的作用域和存储类别知道 内存变量都有生存期 以前接触的变量 其内存的分配及释放都是由系统统一管理的 这一节我们介绍如何实现自己对变量空间的申请和释放 动态内存分配可以提高内存的使用效率 1 相关函数介绍 1 void malloc unsignedsize 该函数实现对内存的申请 申请大小为size 返回值为指针类型 指向所申请空间的首地址 执行后需进行检测 2 voidfree void block 该函数实现对由malloc函数申请到的内存的释放3 voidexit intstatus 该函数终止程序的执行 说明 这3个函数都在头文件stdlib h中 8 9动态内存分配 2 实现方法 1 包含头文件 include2 定义变量 类型名 指针变量名 如int s 3 内存申请 s int malloc n sizeof int 4 检测 if s NULL exit 1 5 使用 for i 0 i n i s i i 6 释放 free s 8 9动态内存分配 例8 19动态内存分配举例 include includemain int s unsignedi n printf Inputthenumber scanf u 8 9动态内存分配 8 10本章程序举例 例8 20编写得到双精度实型数据的整数部分核销数部分的函数 例8 21由小到大数出两个字符串 例8 22将若干字符串按字母顺序由大到小排列 排序算法采用选择法 本章要点小结 1 几种指针的定义格式及含义 1 char p 一般指针 2 char pa N 数组指针 3 char pa N 指针数组 4 char pp 二级指针 5 char fp 指针函数 6 char pf 函数指针 2 正确读指针的方法3 指针与数组
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!