




已阅读5页,还剩101页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第6章指针和引用 教学主要内容指针及指针变量的概念及其定义指针与数组指针与函数指针数组与二级指针动态分配 释放内存引用 2 第6章指针和引用 重点和难点指针及指针变量的概念数组 地址 指针引用的概念 3 第6章指针和引用 教学目标熟练掌握指针的概念熟练掌握指针的应用掌握数组与指针的应用掌握引用的使用 4 第6章指针和引用 6 1指针的概念6 2指针变量6 3指针与数组6 4指针与函数6 5指针数组与二级指针6 6动态分配 释放内存6 7引用 5 6 1指针的概念 指针与地址内存被分成若干个存储单元 每个存储单元的长度为1字节 每个存储单元都有一个固定的编号 即地址 计算机系统就是通过存放数据的第一个存储单元的地址对数据进行访问的 存放某个数据的第一个单元的地址称为该数据的首地址 6 指针与地址 指针即内存单元的地址 数据即内存单元中的内容 值 例如 inta 68 系统为变量a分配4字节的存储空间 首地址为0065FDF4H 那么 通过地址0065FDF4H就能找到变量a在内存中的存储单元 从而对变量a进行访问 065FDF4H就是变量a的指针 68 065FDF4H 7 指针 065FDF4H 内存中每个字节有一个编号即地址 8 6 2指针变量 指针变量 存放地址的变量称为指针变量 例如 inta 68 系统为变量a分配的首地址为0065FDF4H pa是存放变量a地址的指针变量 则pa中存放的值为0065FDF4H a的地址 图6 1变量a及指向变量a的指针pa之间关系 9 指针变量 10 指针与指针变量 对变量的访问有2种方式 直接访问 按变量的地址对变量进行访问 间接访问 先找到存放变量地址的变量 指针 然后根据指针的值访问变量 11 6 2 1指针变量的定义及其初始化 int ip1 ip2 float fp 说明 是指针变量所指向变量的类型 格式 1 指针变量的定义 12 指针变量的定义 下面几种声明指针变量的写法都是合法的int p 与类型名间有空格 与变量名p间没有空格int p 与类型名之间没有空格 与变量名p之间有空格int p 与类型名和变量名p之间都没有空格int p 与类型名和变量名p之间都有空格 13 2 指针变量的初始化 指针变量在定义时可以用任何合法的指针 地址 值进行初始化 格式为 数据类型 指针变量名 初始地址值 将变量i的地址赋给指针变量pi例如 inti floatf int pi 用已初始化的指针变量pf作指针q的初值 14 指针变量的初始化 例6 2 1 阅读程序 给出运行结果 includevoidmain intm 28 int pm 危险 指针p没有确定的指向 15 3 零指针 零指针是一个特殊的指针 它的值为0 C 语言中用符号常量NULL 在ios h中定义 表示这个零值 并保证这个值不会是任何变量的地址 零指针对任何指针类型赋值都是合法的 一个指针变量具有零指针值表示当前它没有指向任何有意义的对象 零指针可以表示为 int p 0 或int p NULL 16 4 void指针 void类型的指针叫通用指针 可以指向任何的变量 C 语言允许直接把任何变量的地址作为指针赋给通用指针 但是当需要使用通用指针所指的数据参加运算时 需要进行类型强制转换 例如 intm 28 int pm 对p进行类型强制转换 转换为int型 17 6 2 2指针变量运算符 两个与指针变量有关的运算符 1 取地址运算符 2 指针运算符 或称间接访问运算符 例如 a为变量a的地址 p为指针变量p所指向的存储单元 18 指针变量运算符 1取地址运算符 19 2 指针运算符 符号 也称为指针运算符 当 作用于指针对象时 就构成指针表达式 其运算结果为该指针所指对象的值 inta 16 b 28 int pa pb 20 指针运算符 符号 有多种含义 的含义随其所作用的对象及其位置的不同而不同 inta 16 b 28 int pa 21 指针运算实例 例6 2 2 阅读下列程序 写出运行结果 includevoidmain inta b int p1 p2 a 100 b 10 p1 22 指针运算实例 例6 2 3 阅读下列程序 写出运行结果 includevoidmain floatx 3 65 p p 23 指针变量应用实例 例6 2 4 输入a和b两个整数 按先大后小的顺序输出 用指针实现 24 指针变量应用实例 例6 2 4 输入a和b两个整数 按先大后小的顺序输出 用指针实现 includeusingnamespacestd intmain int p1 p2 p a b cin a b 输入两个整数p1 25 6 2 3指针的运算 赋值运算指针的赋值运算可以通过指针的初始化实现 也可以在程序中通过赋值语句来实现 例如 inta 8 pa 26 指针的运算 2 算术运算指针只能进行下列算术运算 与整数的加减运算和自增 自减运算 由于指针的特殊性 这些算术运算也称为移动指针运算 27 指针的运算 3 指针相减当两个指针指向同一数组时 两个指针的相减才有意义 两个指针相减结果为一整数 表示两个指针之间数组元素的个数 例如 inta 6 12 15 26 18 29 13 p1 a 2 p2 p2 a 5 cout p2 p1 endl 结果为3 28 4 指针比较运算 两个指针指向同一串连续的存储单元时 可以在关系表达式中对其进行比较 判断指针的位置关系 两个指针变量的值相等 表示它们指向同一个存储单元 还可进行是否是空指针的判断 例如 inta 6 12 15 26 18 29 13 pa a p1 a 2 p2 p2 a 5 if p1 p2 cout p2equalp1 endl elsecout p2donotequalp1 endl 29 指针运算应用实例 includevoidmain inta 10 23 36 0 6 56 12 98 50 32 66 a指向数组a的首地址int pa a p1 p2 p1 a p2 a 9 while pa p2 cout pa cout endl pa a cout pa pa endl cout pa pa endl cout pa pa endl cout pa pa endl cout pa pa endl 30 6 3数组与指针 6 3 1指针与一维数组数组名不仅仅表示数组的名称 还表示数组在内存中的首地址 数组名是由系统分配的地址常量 不允许用户修改 例如 对于数组inta 6 16 12 56 89 66 34 a表示数组a的首地址 即第1个元素的地址 a 1表示第2个元素的地址 a i表示第i 1个元素的地址 0 i 5 31 指针与一维数组 表6 3 1数组名访问数组元素的两种形式 32 指针与一维数组 说明 对于一维数组 1 数组名a表示数组的首地址 即a 0 的地址 2 数组名a是地址常量 a i是元素a i 的地址 3 由于a i与 a i 等价 实际上数组元素的下标访问方式也是按地址进行的 4 a i 与 a i 是等价的 33 指针与数组示例 实例6 3 1 通过数组首地址访问一维数组元素 includevoidmain inta 6 22 36 18 23 66 58 for inti 0 i 6 i cout a i cout endl 34 使用指针访问数组元素 通过指针引用一维数组元素需要一个指向数组元素的指针变量 它的基类型与数组元素的类型相同 使用指针访问数组元素是C 语言提供的一种高效数组访问机制 例如 对于数组inta 6 22 36 18 23 66 58 int p a 指针变量p可以指向a数组的任何一个元素的地址 从而使用指针变量可以访问数组的元素 35 使用指针访问数组元素 表6 3 2指针变量访问数组元素的两种形式 36 指针与数组示例 实例6 3 2 使用指针变量访问一维数组元素 includevoidmain inta 6 22 36 18 23 66 58 int p a cout p i show n for inti 0 i 6 i cout p i cout n p show n 指针重新指向数组a的首地址while p a 6 cout p cout np i show n p a for i 0 i 6 i cout p i cout endl 37 指针与数组示例 说明 1 使用指针常量 数组名 可以访问数组元素 但数组名不能修改 使用指针变量访问数组元素就显得更加灵活方便 2 指针有效范围必须满足数组空间的限制 避免越界访问 这个问题与数组下标越界问题的控制同样重要 3 p i 和 p i 这两种形式是等价的 都表示访问数组的第i 1个元素 所以 a i p i p i a i 38 6 3 2指针与二维数组 1 二维数组的地址对于二维数组inta 3 4 先将其看成是1个一维数组 a 0 a 1 a 2 而每个元素 a 0 a 1 a 2 又是个有4个元素的一维数组 即 a 0 a 1 a 2 又分别包含4个元素 a 0 a 0 0 a 0 1 a 0 2 a 0 3 a 1 a 1 0 a 1 1 a 1 2 a 1 3 a 2 a 2 0 a 2 1 a 2 2 a 2 3 39 指针与二维数组 a表示数组元素a 0 的地址 即第1行的首地址 称为行指针a 1表示数组元素a 1 的地址 即第2行的首地址 称为行指针a 2表示数组元素a 2 的地址 即第3行的首地址 称为行指针 同时 a 0 a 1 a 2 也是三个一维数组的名字 同理 a 0 表示数组a 0 4 的首地址 即第1行第1个元素的地址 a 0 a 0 0 列指针a 1 表示数组a 1 4 的首地址 即第2行第1个元素的地址 a 1 a 1 0 列指针a 2 表示数组a 2 4 的首地址 即第3行第1个元素的地址 a 2 a 2 0 列指针 从值上看 a a 0 a 1 a 1 a 2 a 2 a i表示a数组中第i行的首地址 a i 表示a数组第i行首列的地址 40 指针与二维数组 由一维数组可知 a i 与 a i 等价 在二维数组种同样适用 但是 a i 表示二维数组第i行首列的地址 因此 a i 也表示二维数组第i行首列的地址 a 0 0表示第1行第1列元素的地址 a 0 a 0 0 a i 列指针a 0 1表示第1行第2列元素的地址 a 0 1 a 0 1 a i 1 列指针a 0 2表示第1行第3列元素的地址 a 0 2 a 0 2 a i 2 列指针a 0 3表示第1行第4列元素的地址 a 0 3 a 0 3 a i 3 列指针 41 表6 3 4二维数组的地址 42 指针与二维数组 说明 对于二维数组 1 a i a i a i a i a i 0 值相等 含义不同 2 a i a i 是行地址 a i a i a i 0 是列地址 43 2 使用二维数组的地址访问数组元素 与一维数组类似 可以用二维数组的地址访问数组元素 二维数组a n m 的元素a i j 的引用可以用下面五种方法 a i j a i j a i j a i j a 0 0 m i j 44 指针与二维数组示例 例6 3 3 通过数组首地址 采用不同的形式访问二维数组元素 includevoidmain inta 3 4 6 9 0 12 5 8 21 36 3 19 66 32 inti j cout a i j show n for i 0 i 3 i for j 0 j 4 j cout a i j cout n a i j show n for i 0 i 3 i for j 0 j 4 j cout a i j 45 指针与二维数组示例 cout n a i j show n for i 0 i 3 i for j 0 j 4 j cout a i j cout n a i j show n for i 0 i 3 i for j 0 j 4 j cout a i j cout n 46 3 使用指向二维数组元素的指针变量访问数组元素 例6 3 4 使用指向二维数组元素的指针变量访问二维数组元素 includevoidmain inta 3 4 6 9 0 12 5 8 21 36 3 19 66 32 inti j p for p a 0 p a 0 12 p if p a 0 4 0 cout endl cout p 47 6 3 3字符串与指针 字符型指针变量可以指向字符型常量 字符型变量 字符串常量以及字符数组 使用指针变量处理字符串时 一定要使指针变量有确定的指向 48 字符串与指针示例 例6 4 1 阅读下列 写出运行结果 includevoidmain chars C program char ps1 computer char ps2 ps3 s ps2 mouse cout s ps1 ps2 ps3 endl ps1 ps2 2 ps3 4 cout s 4 ps1 ps2 ps3 endl cout s ps1 ps2 ps3 endl ps1 s 49 指针引用字符串说明 1 对数组s的初始化 实际上是使s 0 C s 1 s 11 m s 12 0 对指针ps1的初始化是使ps1指向字符串 computer 的首地址 ps2 mouse 是将字符串 mouse 的首地址赋给ps2 2 ps3是指针变量 可以与整数进行加减运算 s是指针常量 不允许用户修改 ps1 使ps1指向字符串 computer 的第2个字符o 50 指针引用字符串说明 3 输出字符指针就是按地址输出字符串 输出指针的间接引用就是输出指针所指单元的字符 4 执行ps1 s 之后 ps1指向s数组的首地址 字符串常量 computer 仍然存在于内存中 但是没有指针指向该字符串 因此也就无法访问了 5 指向字符串中任一位置的指针都是一个指向字符串的指针 该字符串从所指位置开始 直到字符串 0 为止 51 指针引用字符串说明 例6 4 2 编写一个程序 完成字符串的复制 includevoidmain charsm 20 sn C program char s1 sm s2 sn while s1 s2 0 s1 s2 cout sm sm endl 52 6 3 4指针数组与指向指针的指针变量 1 指针数组如果数组元素都是相同类型的指针 则称这个数组为指针数组 所谓相同类型的指针是说指针所指向的对象类型是相同的 例如 语句int p 5 定义了一个指针数组 p 5 表示一个数组 而 表示后面的对象为一个指针变量 合在一起 p 5 表示一个指针数组 该数组包含5个元素 每个元素都是指向int型的指针 53 指针数组 指针数组一般用于处理二维数组 更多的用于处理多个字符串 例如 char pcolor 5 Red Yellow Green Blue Orange charsc 5 7 Red Yellow Green Blue orange 54 指针数组 55 指针数组 56 指针数组 说明 1 对于二维数组 每个字符串所占内存的大小是一致的 所以取最长字符串的长度作为二维数组列的大小 2 用指针数组存储字符串可以节省存储空间 每个字符串所占的存储单元可以不等长 57 指针数组示例 includevoidmain char pseason 4 Spring Summer Autumn Winter intmonth charch while 1 cout month 例6 7 输入月份 1 12 输出该月份所在季节的英文名称 58 指针数组示例 switch month case12 case1 case2 cout pseason 3 endl break case3 case4 case5 cout pseason 0 endl break case6 case7 case8 cout pseason 1 endl break case9 case10 case11 cout pseason 2 endl break default cout inputdataerror pleasetryagain endl 59 指针数组示例 cout ch if ch y ch Y continue elsebreak 60 2指向一维数组的指针变量 intb 3 5 12 36 62 14 56 98 74 63 56 99 55 88 33 22 11 int p 5 b 说明 1 p表示指向数组b的行指针 2 若初始化 p 5 b 0 会出现语法错误 因为指针p已被定义成指向一维数组的指针 61 指向一维数组的指针变量示例 例6 8 运行下列程序 写出运行结果 includevoidmain intb 3 5 12 36 62 14 56 98 74 63 56 99 55 88 33 22 11 int p 5 b inti j cout 输出b数组每行的首地址 n for i 0 i 3 i cout p i cout endl for i 0 i 3 i cout p i cout endl 62 指向一维数组的指针变量示例 cout 输出b数组每个元素的地址 n for i 0 i 3 i for j 0 j 5 j cout p i j cout endl for i 0 i 3 i for j 0 j 5 j cout p i j cout endl 63 指向一维数组的指针变量示例 cout 输出b数组每个元素的值 n for i 0 i 3 i for j 0 j 5 j cout p i j cout endl for i 0 i 3 i for j 0 j 5 j cout p i j cout endl 64 3指向指针的指针变量 定义 如果指针变量中存放的是另一个指针的地址就称该指针变量为指向指针的指针变量 指向指针的指针变量也称为二级指针 格式 例如 有如下声明语句 intx 32 int p 65 指向指针的指针变量 通过p和pp都可以访问x pp表示它所指向变量p的值 即x的地址 pp表示它所指向的变量p所指向变量的值 即x的值 66 指向指针的指针变量示例 例6 9 阅读下列 写出运行结果 includevoidmain intb 3 4 12 36 62 56 98 63 56 99 88 32 66 22 int p 3 b 0 b 1 b 2 int pp p inti j cout 输出b数组每行的首地址 n for i 0 i 3 i cout pp cout endl 67 指向指针的指针变量示例 pp p for i 0 i 3 i cout pp i cout endl for i 0 i 3 i cout p i cout endl cout 输出b数组每个元素的地址 n for i 0 i 3 i for j 0 j 4 j cout pp i j cout endl 68 指向指针的指针变量示例 for i 0 i 3 i for j 0 j 4 j cout p i j cout endl cout 输出b数组每个元素的值 n for i 0 i 3 i for j 0 j 4 j cout pp i j cout endl for i 0 i 3 i for j 0 j 4 j cout p i j cout endl 69 6 5指针与函数 6 5 1指针作为函数的参数指针既可以作为函数的形参 也可以作为函数的实参 指针作为函数参数的传值方式称为地址传递 1 用数组名 指针常量 作为形参和实参用数组名作为形参和实参实际上是形参和实参共用内存中的一个数组 70 数组作为函数的参数示例 includevoidadd intb intm for inti 0 i m i b i voidmain inta 5 12 32 56 63 86 intn 5 add a n for inti 0 i n i cout a i 例6 10 利用函数将一维数组中每个元素的值加1 71 2 一个参数用数组名 另一个参数用指针 includeintsum int p intm ints 0 for inti 0 i m i s p returns voidmain inta 5 10 30 50 60 80 intn 5 s s sum a n cout s 例6 11 利用函数求一维数组中各元素之和 72 3 用指针作为形参和实参 includevoidmain inta 10 102 35 56 48 80 12 38 0 9 58 intn 10 p a voidsort int q intm sort p n for inti 0 i n i cout p 例6 12 利用函数将一维数组中各元素按从大到小的顺序排列输出 73 用指针作为形参和实参示例 voidsort int q intm inttemp q1 q2 for inti 0 i m 1 i q1 q i for intj i 1 j m j q2 q j if q1 q2 temp q1 q1 q2 q2 temp 74 6 5 2函数返回值为指针的函数 当一个函数声明其返回值为指针类型时 就是要返回一个地址值给调用函数 格式 形参声明表 其中 是指针所指向对象的类型 表示函数的返回值是指针 75 函数返回值为指针的函数 例6 13 利用函数求两个一维数组对应元素之和 includeint sum int pa int pb int pc intm int q pc for inti 0 i m i pc pa pb returnq voidmain inta 10 102 35 56 48 80 12 38 0 9 58 intb 10 1 2 3 4 5 6 7 8 9 10 intc 10 n 10 p p sum a b c n for inti 0 i n i cout p 76 6 5 3指向函数的指针 函数名是一个指针常量 它指向该函数代码的首地址 通过函数名调用函数 实际上就是根据函数名找到函数代码的首地址 从而执行这段代码 格式 其中 为函数返回值的类型 与指针运算符 外面的圆括号 是必须的 表示变量名为指针变量 指明这种指针变量是指向函数的指针变量 77 指向函数的指针 例如 int fptr1 inta intb int fptr2 inta intb 1 fptr1是指向函数的指针 该函数有两个整型参数a b 返回值为整型 2 fptr2是函数名 该函数也有两个整型参数a b 返回值为指向整型的指针 78 指向函数的指针 当把函数的地址赋给与函数具有相同类型的函数指针变量后 就可以用函数指针调用该函数了 例如 intfunc inta intb int fptr inta intb fptr func 则可采用下列语句格式调用函数func k func 3 5 k fptr 3 5 k fptr 3 5 79 指向函数的指针示例 例6 14 完成两个整数的四则运算 include includefloatadd floatx floaty cout x y returnx y floatsub floatx floaty cout x y returnx y floatmul floatx floaty cout x y returnx y floatdev floatx floaty cout x y returnx y 80 指向函数的指针示例 voidmain floata b charop float fp float float while 1 cout a op b 81 指向函数的指针示例 switch op case fp add break case fp sub break case fp mul break case fp dev break default cout op if op y 82 6 6new与delete 6 6 1new和delete运算符1 new运算符new用于为各种数据类型分配内存 并把分配到的内存首地址赋给相应的指针 格式1 new 格式2 new 常量 格式3 new 83 new运算符 例如 int ip1 ip2 ip3 ip1 newint ip指向1个未初始化的int型对象ip2 newint 68 ip指向1个表示为68的int型对象ip3 newint 5 ip指向5个未初始化的int型对象的首地址 84 2 delete运算符 当程序不再需要由new分配的内存空间时 可以用delete释放这些空间 格式1 delete 格式2 delete 格式3 delete 85 delete运算符 例如 int ip1 ip2 ip3 ip1 newint ip2 newint 68 ip3 newint 5 deleteip1 delete ip2 delete 5 ip3 86 newdelete运算符示例 例6 15 阅读程序 includevoidmain int ip1 ip2 ip3 ip1 newint ip2 newint 68 ip3 newint 5 ip1 12 char cp1 cp1 newchar cp1 A for inti 0 i ip3 i cout ip1 ip2 cp1 endl for i 0 i 5 i cout ip3 i cout endl delete ip1 delete ip2 delete 5 ip3 cout ip1 ip2 cp1 endl 87 6 6 2使用new和delete应注意的事项 1 用new申请分配内存时 不一定能申请成功 若申请失败 则返回NULL 即空指针 2 用new运算符为多个对象申请分配内存空间时 不能提供初始化 3 由new分配的内存空间必须保存起来 以便用delete删除 否则会出现不可预测的错误 88 6 9引用 6 9 1引用类型变量的说明及使用引用类型的变量是其他变量的别名 因此 对引用型变量的操作实际上就是对被引用变量的操作 当声明一个引用型变量时 必须用另一个变量对其初始化 格式 其中 是被引用变量的的类型 说明变量为引用类型变量 89 引用 例如 intx intrefx是一个引用型变量 它被初始化为对整型变量x的引用 即给整型变量x起了一个别名refx refx就称为对x的引用 x称为refx的引用对象 在声明引用型变量refx之前变量x必须先声明 90 引用 例6 16 引用的使用 includevoidmain intx y 36 int 91 6 9 2引用与函数 1 引用作为函数的参数引用可以作为函数的参数 建立函数参数的引用传递方式 传递的是变量的别名 引用作为函数参数具有两个优点 1 参数传递方式类似于指针 但可读性却比指针传递强 2 调用函数语法简单 与简单传值调用一样 但其功能却比传值方式强 92 引用与函数示例 例6 17 使用引用参数 实现两个数据的交换 includevoidswap int 93 引用与函数示例 voidmain intx 63 y 36 cout frontswap nx x y y endl swap x y cout backswap nx x y y endl 94 2 引用作为函数的返
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 惠州家具基础知识培训班课件
- 2026届上海外国语大学附属浦东外国语学校化学高一上期中质量跟踪监视试题含解析
- 河北省石家庄市晋州市第一中学2026届化学高二第一学期期末质量检测模拟试题含答案
- 悬架说课课件
- 教师节举办庆典策划方案
- 舞蹈社团新学期工作方案
- 特殊学校课程设置活动方案
- 新学期幼教教学工作方案
- 小学元旦主题班会活动方案(标准模版)
- 融创成本管理岗中国面试题及答案
- 2024兴平市辅警招聘考试真题
- 2025年保育员初级考试试题试题(含答案)(完整版)
- 2024年江苏镇江市科学技术局遴选事业单位人员2人笔试高频难、易错点备考题库及参考答案详解1套
- 小儿川崎病护理查房
- 成都市二手房买卖合同房屋交易税费缴纳及减免协议
- 电力工程管理培训课件
- 经食道心脏超声技术规范
- 四川省达州市达川区2024-2025学年八年级下学期6月期末考试英语试题(含笔试答案无听力答案、原文及音频)
- 员工食堂安全培训课件
- epc工程管理制度
- 2025年供应链金融与风险控制考试试题及答案
评论
0/150
提交评论