C高级语言程序设计第6章.ppt

上传人:max****ui 文档编号:6335593 上传时间:2020-02-23 格式:PPT 页数:87 大小:847.31KB
返回 下载 相关 举报
C高级语言程序设计第6章.ppt_第1页
第1页 / 共87页
C高级语言程序设计第6章.ppt_第2页
第2页 / 共87页
C高级语言程序设计第6章.ppt_第3页
第3页 / 共87页
点击查看更多>>
资源描述
2020 2 23 1 C 高级语言程序设计 第6章指针和引用北京邮电大学信息与通信工程学院 北京邮电大学信息与通信工程学院 指针 Pointer 是C 和C的一种数据类型 很多其他高级语言也有类似的数据类型 引用 Reference 则是C 所特有的一种数据类型 指针和引用在概念上和使用上都有相似之处 但是也有重要的差别 2020 2 23 2 北京邮电大学信息与通信工程学院 第六章指针和引用 6 1指针的概念6 2指针的运算6 3指针访问动态内存6 4指向结构体的指针6 5引用概念6 6指针和引用作为函数的参数6 7指针和引用作为函数的返回值6 8指针和字符串6 9通过指针访问数组 2020 2 23 3 北京邮电大学信息与通信工程学院 6 1指针的概念 2020 2 23 4 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 5 6 1 1指针和指针变量 指针是变量的地址 或者说是在内存中 存放某种类型变量的地址 例如 定义了整型变量a a的地址就是一个指针 也可以不定义任何变量 只是指定内存某个地址开始 如0 x00430100 的4个字节存放整型变量 这样的地址也是指针 存放指针的变量就是指针变量 2020 2 23 北京邮电大学信息与通信工程学院 6 6 1 1指针和指针变量 当声明了一个指针变量后 确定了三件事 变量本身在内存中所分配的地址和字节数 指针变量总是占有4个字节 系统允许的地址范围 以及地址单元内可以存放的内容 指针变量可以进行的运算 访问指针变量时 只能看到地址 只有通过这个地址 才能访问地址单元中的内容 这样的访问称为对于内存单元的间接访问 2020 2 23 北京邮电大学信息与通信工程学院 7 6 1 2指针变量的声明和初始化 指针变量声明的格式是 变量名1 变量名2 例如 int va1 va2 char ch1 ch2 指针变量在声明后 变量的值 地址 是随机的 这样的指针变量是不能安全的使用的 因为其中的随机地址完全可能不是有效的数据地址 2020 2 23 北京邮电大学信息与通信工程学院 8 6 1 2指针变量的声明和初始化 在声明指针变量时的 有两个含义 声明变量va1 va2 ch1 ch2都是指针变量 说明变量va1和va2的类型是 int 型 即指向整型变量的指针 va1和va2所指定的地址单元中 只能存放整型数据 类似地 ch1和ch2的类型是 char 型 它们所指定的地址单元中 只能存放字符 指针变量都是有类型的 指针变量的类型就是它所指定的地址单元中存放的数据的类型 2020 2 23 北京邮电大学信息与通信工程学院 9 6 1 2指针变量的声明和初始化 指针变量的初始化有两种方法 在声明时的初始化和声明后的初始化 声明指针变量时就进行初始化的格式是 指针变量名 2020 2 23 北京邮电大学信息与通信工程学院 10 6 1 2指针变量的声明和初始化 也可以在声明指针变量后 用赋值的方式对它们进行初始化 例如 inti1 Y i2 A int pi1 pi2 pi1 没有初始化指针变量是不可以使用的 编译带有这样的指针变量的程序 编译系统会给出警告 而运行时会出现错误 6 2指针的运算 2020 2 23 11 北京邮电大学信息与通信工程学院 6 2指针的运算 表6 1指针的运算 2020 2 23 12 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 13 6 2 1指针的赋值运算 指针的赋值运算一定是地址的赋值 用来对指针变量赋值的可以是 同类型变量的地址 同类型的已经初始化的指针变量 其他同类型的指针 此外 也可以用0或者NULL对指针变量赋值 使得变量包含的是 空指针 即不指向任何的内存物理地址 必须注意 不同类型的指针是不可以互相赋值的 在指针赋值时 不存在类型自动转换的机制 2020 2 23 北京邮电大学信息与通信工程学院 14 例6 1观察以下指针赋值运算的结果 如果将注释去掉 结果将如何 includeusingnamespacestd voidmain intva1 100 pva1 floatvf1 A pvf1 pvf2 int pva2 NULL cout valueofpva1is pva2 endl pva1 valueofpva1is0 x000000000 x0012FF7C0 x0012FF7C0 x0012FF740 x0012FF74注释去掉会出现编译错误 2020 2 23 北京邮电大学信息与通信工程学院 15 6 2 2间接引用运算 间接引用运算符 是一种一元算符 它和指针变量连用 对指针所指向的内存地址单元进行间接访问 使用的格式是 指针变量如果指针变量iptr指向整型变量va iptr就是变量va的内容 2020 2 23 北京邮电大学信息与通信工程学院 16 例6 2对变量的直接访问和间接访问 写出以下程序运行结果 includeusingnamespacestd voidmain charch1 a ch intk1 100 ch 间接访问 运行结果 ch ach1 B ch d 2020 2 23 北京邮电大学信息与通信工程学院 17 例6 3定义指向指针的指针变量 观察对这种指针变量间接访问的结果 includeusingnamespacestd voidmain intva 100 pva ppva ppva是指向指针的指针intk1 100 pva 就是指针pva的内容 运行结果 pva 100 ppva 0 x0012FF7Cpva 0 x0012FF7C 2020 2 23 北京邮电大学信息与通信工程学院 18 6 2 2间接引用运算 2020 2 23 北京邮电大学信息与通信工程学院 19 6 2 3指针的算术运算 指针可以进行的算术运算只有加法和减法 指针可以和一个整数n做加法或者减法运算 指针p和整数n相加 相减 的含义是指向当前指向位置p的前方或后方第n个数据的地址 2020 2 23 北京邮电大学信息与通信工程学院 20 例6 3通过指针的间接访问 输出下标为偶数的数组元素的值 includeusingnamespacestd voidmain intk1 10 11 24 37 44 58 66 79 86 93 108 k k 运行结果 K1 0 11k1 2 37 数组第一个元素 下标为0 的地址赋值给指针k 每次循环 指针加2 2020 2 23 北京邮电大学信息与通信工程学院 21 6 2 3指针的算术运算 指针和指针的直接加法是没有意义的 也是不允许的 指针和指针的减法是可以进行的 其意义是求出两个指针之间可以存放几个指定类型的数据 不允许用一个整数减一个指针 2020 2 23 北京邮电大学信息与通信工程学院 22 6 2 4指针的关系运算和逻辑运算 相同类型的指针可以进行各种关系运算 比较两个指针相等还是不相等 进行指针 大于 小于 的比较 只是要判定指针在内存中的相对位置 指针和一般的整数比较是没有意义的 也是不允许的 惟一可以和指针比较的整数是0 通过指针和0的比较来判定指针本身是不是空指针 2020 2 23 北京邮电大学信息与通信工程学院 23 6 2 5void类型指针 void类型的指针就是 无类型 指针 声明的方式如下 void void类型的指针变量中存放的也是内存的地址 但是不指定这个地址单元内的数据的类型 2020 2 23 北京邮电大学信息与通信工程学院 24 6 2 5void类型指针 void类型的指针的使用 任何其他类型的指针都可以赋值给void指针 必须注意 这样赋值后的void指针的类型仍然是void void类型指针不可以直接赋值给任何其他类型的指针 无论何时 void指针都不可以通过间接引用来访问内存中的数据 要通过void类型指针访问内存的数据 必须进行指针类型的强制转换 才可以通过指针间接引用访问内存数据 2020 2 23 北京邮电大学信息与通信工程学院 25 void类型指针 void类型指针还有一个具体的应用 显示字符指针的内容 除了字符指针外 其他指针都可以直接用cout语句来输出地址值 但是 用cout输出字符指针时 则是输出它所指向的字符串 可以将字符指针强制转换为void指针 再用cout语句输出 就可以看到地址值 如 char pch HelloC cout pch endl cout void pch endl 2020 2 23 北京邮电大学信息与通信工程学院 26 例6 4使用memcpy通用复制函数复制数组 includeusingnamespacestd includevoidmain charsrc 10 012345678 chardest 10 char pc char memcpy dest src 10 cout pc endl ints1 3 1 2 3 intd1 3 int pi int memcpy d1 s1 12 cout pi pi 1 pi 2 endl 运行结果 012345678123 复制字符数据 10个字节 复制整型数据 12个字节 2020 2 23 北京邮电大学信息与通信工程学院 27 6 2 6指针类型转换 实际应用的指针变量都是有类型的 指针类型就是指针所指的地址空间所存放的数据的类型 除了void指针 不同类型的指针是不可以自动类型转换的 也就不能进行赋值运算 在例6 1中的语句pvf1 pva1 整型指针赋值给float指针 就是有语法错误的语句 指针类型不仅不能自动转换 也不能进行强制类型转换 2020 2 23 北京邮电大学信息与通信工程学院 28 指针类型转换 若pch是字符指针 p是double类型指针 以下的语句 pch static cast p 在编译时有语法错误 不能将double 转换为char 也就是说指针的强制类型转换也是不允许的 但是 如果使用C风格的类型转换 pch char p 在编译时没有语法错误 仅在执行时有问题 所以 还是要使用static cast来进行强制类型转换 唯一允许的是void指针和其它指针类型之间的转换 2020 2 23 北京邮电大学信息与通信工程学院 29 例6 5利用格式控制符hex可以显示整数的机器数的程序 includeusingnamespacestd voidmain floatf 1 0 float fPtr 6 3指针访问动态内存 2020 2 23 30 北京邮电大学信息与通信工程学院 指针访问动态内存 动态内存是在程序执行时才可以申请 使用和释放的内存 也就是存放动态数据的内存区域 存放动态数据的区域称为 堆 动态内存也称为堆内存 动态内存不能通过变量名来使用 而只能通过指针来使用 2020 2 23 31 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 32 6 3 1动态内存的申请和释放 C 中通过运算符new申请动态内存 运算符delete释放动态内存 动态内存申请运算符new的使用格式 new 初值 运算的结果 如果申请成功 返回指定类型内存的地址 如果申请失败 返回NULL指针 动态内存使用完毕后 要用delete运算来释放 delete运算符使用格式 delete 2020 2 23 北京邮电大学信息与通信工程学院 33 6 3 2动态数组空间的申请和释放 申请动态一维数组时 要在new表达式中加上申请数组的大小 new 常量表达式 注意 在动态申请数组空间时 不可以对数组进行初始化 也可以申请二维数组的空间 int pi marray 4 pi marray newint 3 4 释放动态数组空间都用相同的表达式 delete 2020 2 23 北京邮电大学信息与通信工程学院 34 6 3 3内存泄漏和指针悬挂 内存泄漏是指动态申请的内存空间 没有正常释放 但是也不能继续使用的情况 如 char ch1 ch1 newchar A char ch2 newchar ch1 ch2 原来为ch1所申请的存放字符A的空间就不可能再使用了 产生了内存泄漏 2020 2 23 北京邮电大学信息与通信工程学院 35 6 3 3内存泄漏和指针悬挂 让指针指向一个已经释放的空间 即所谓的指针悬挂 Dangling 如 char ch1 ch2 ch1 newchar ch2 ch1 ch2 B deletech1 指针ch2就是指向了一个已经释放的地址空间 形成指针悬挂 如果还要用deletech2 语句来释放ch2所指向的空间 就会出现运行错误 6 4指向结构体的指针 2020 2 23 36 北京邮电大学信息与通信工程学院 指向结构体的指针 定义变量时 我们可以定义指向int型的指针变量 类似的 可以有指向新定义的结构型数据类型的指针变量 声明了指向结构的指针后 必须对指针初始化 现在我们知道对于指针的初始化有两种方法 其一是用已经定义的变量地址来初始化 其二是用new申请一个地址来对指针赋值 2020 2 23 37 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 38 具体对结构指针来说 1 可以将结构变量的地址赋给结构指针 使用取地址 定义结构指针并初始化 2020 2 23 北京邮电大学信息与通信工程学院 39 2 使用new操作在堆中给结构指针分配空间 例如 student ps newstudent 定义结构指针用动态地址初始化用结构指针访问结构成员时 用箭头操作符代替原来的点操作符对结构体成员进行操作 比如 把学生的成绩输出显示 语句如下 coutscore 其中 ps score等价于 ps score 2020 2 23 北京邮电大学信息与通信工程学院 40 解 说明 每个员工的信息包括姓名 工作证号 薪水 定义为结构类型 定义结构指针并让它的指向确定 通过结构指针访问结构成员 输出显示员工的信息 例6 6结构指针的定义和使用 include includeusingnamespacestd structEmployee charname 20 unsignedlongid floatsalary 例6 6结构指针的定义和使用 2020 2 23 北京邮电大学信息与通信工程学院 41 voidmain Employeepr1 Employee prPtr prPtr 程序运行结果 zhangsan980013350 6 5引用概念 2020 2 23 42 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 43 引用概念 引用 Reference 是C 中新引入的概念 也是C语言中不存在的数据类型 引用是变量或者其他编程实体 如对象 的别名 因此 引用是不可以单独定义的 如图6 4 a 所示 变量A在内存中有自己的地址 而A的引用B实际上就是变量A 只是A的另外一个名字 2020 2 23 北京邮电大学信息与通信工程学院 44 6 5 1引用的声明 引用是通过运算符必须注意 引用必须在声明的时候就完成初始化 不可以先声明引用 然后再用另一个语句对它初始化 2020 2 23 北京邮电大学信息与通信工程学院 45 引用有以下的特点 引用不能独立存在 它只是其他变量的别名 引用必须在声明的同时就初始化 引用一旦定义 引用关系就不可以更改 即B若是A的引用 就不可能是其他变量的引用 引用的类型就是相关的变量的类型 引用的使用和变量的使用相同 2020 2 23 北京邮电大学信息与通信工程学院 46 例6 7引用的使用 观察以下程序的结果 includeusingnamespacestd voidmain intintA 10 int 6 5 2引用的使用 2020 2 23 北京邮电大学信息与通信工程学院 47 引用的值和相关变量值相同 refA 10引用的变化 则相关变量也变化 intA 5引用的地址和相关变量地址相同 intA的地址 0 x0012FF7C引用的地址和相关变量地址相同 refA的地址 0 x0012FF7C 程序的结果 6 6指针和引用作为函数的参数 2020 2 23 48 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 49 指针和函数 在程序设计中 指针有很多应用 其中之一就是用指针作为函数的参数 从而形成了C 函数调用中的另一种调用方式 地址调用 2020 2 23 北京邮电大学信息与通信工程学院 50 6 6 1指针作为函数的参数 用指针作为函数参数 实现地址调用 必须满足以下条件 函数的形式参数是指针变量 函数的实参数是内存的地址 具体来说可以是数组名 变量的地址 用变量地址初始化的指针 形参指针类型和实参地址类型必须相同 2020 2 23 北京邮电大学信息与通信工程学院 51 6 6 1指针作为函数的参数 满足以上条件后 这样的函数调用在使用上有以下的特点 实参传递给形参的是内存的地址 所以形参指针指向实参变量 形参指针通过间接引用 直接访问实参变量 包括改变实参变量的值 函数调用后 可以保留对实参变量的操作结果 如果有多个实参 就可以有多个实参变量在函数调用中得到修改 2020 2 23 北京邮电大学信息与通信工程学院 52 例6 8编写数据交换的函数 在main中调用这个函数 交换main中定义的变量 includeusingnamespacestd voidSwap int a int b voidmain intx 5 y 10 cout 主函数变量的值 x x y y endl Swap 运行结果 主函数变量的值 x 5y 10函数中完成了交换 a 10 b 5返回后变量的值 x 10y 5 变量的地址作为实参数 指针变量作为形式参数 2020 2 23 北京邮电大学信息与通信工程学院 53 6 6 1指针作为函数的参数 程序中用变量x和y的地址作实参 传递给指针a和b 如图6 1 a 通过间接引用 a和 b进行交换 实际上就是x和y进行交换 如图6 1 b 2020 2 23 北京邮电大学信息与通信工程学院 54 6 6 2引用作为函数参数 引用使用最多的场合是作为函数的形式参数 引用作为函数的形式参数具有以下的特点 引用作为形式参数时 实参数是相同类型的变量 引用作为形式参数 参数传递属于地址传递 引用作为形式参数时 在函数中并不产生实参数的副本 形式参数的引用和实参数的变量实际上是同一个实体 函数对引用的操作 也是对实参变量的操作 函数调用可以改变实参数的值 2020 2 23 北京邮电大学信息与通信工程学院 55 例6 9用引用作为形式参数 通过函数调用 交换两个实参数 includeusingnamespacestd voidswap 1 int 函数调用前 a 12345b 54321函数调用后 a 54321b 12345 2020 2 23 北京邮电大学信息与通信工程学院 56 6 6 2引用作为函数参数 使用引用作为形式参数还需要注意 如果实参数需要保护 可以使用 常引用 作为形式参数 用引用作形参和用变量作形参是有区别的 但是 对于这两种情况 实参数可能相同 例如 函数swap inta intb 和swap int a int b 看起来是两个可以区分的重载函数 但是 都可以用整型变量x和y来调用 swap x y 因此 实际上是不可区分的 函数swap inta intb 和swap int a int b 不是可以区分的重载函数 2020 2 23 北京邮电大学信息与通信工程学院 57 6 6 3常指针和常引用 常指针是指向常量的指针 PointertoConstantdata 的习惯说法 就是规定指针所指向的内容不可以通过指针的间接引用来改变 常指针说明的格式是 const 例如 constint ptint 指针ptint的类型是 constint 也就是指向一个恒定的整型数 2020 2 23 北京邮电大学信息与通信工程学院 58 例6 10常指针示例 观察以下程序的运行 includeusingnamespacestd voidmain intia 10 ib 20 constint ptint ptint 语句错误 左值是常量 运行结果 10120 常指针声明 注释去掉会出现编译错误 2020 2 23 北京邮电大学信息与通信工程学院 59 6 6 4指针的指针作为函数的参数 如果一定要改变实参指针的值 可以用指针变量的地址作实参 形式参数就应该是指针的指针 2020 2 23 北京邮电大学信息与通信工程学院 60 例6 12指针变量指向一个数组 用指针变量作为实参调用一个函数 在函数中指针指向数组的第二个元素 观察函数返回后 实参指针值有无变化 includeusingnamespacestd voidMove int a voidmain intx 5 10 20 30 40 50 px x cout 调用前的 px px endl Move px cout 调用后的px if px x cout 没有变化 px还是 px endl elsecout 也向前移动 px变为 px endl voidMove int a a a 1 cout 函数中完成了指针移动 a a endl 运行结果 调用前的 px 10函数中完成了指针移动 a 20调用后的px没有变化 px还是10 指针作为实参数 指针变量作为形式参数 2020 2 23 北京邮电大学信息与通信工程学院 61 例6 13修改例6 12 使得实参指针返回后 指向新的地址 includeusingnamespacestd voidMove int a voidmain intx 5 10 20 30 40 50 px x cout 调用前的 px px endl Move 运行结果 调用前的 px 10函数中完成了指针移动 a 20调用后的px也向前移动 px变为20 指针的地址作为实参数 指针的指针作为形式参数 6 7指针和引用作为函数的返回值 2020 2 23 62 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 63 6 7 1指针函数 如果一个函数的返回值是指针 则这样的函数称为指针函数 如 int func01 intk 函数func01返回一个指向整型数据的指针 返回指针 实际就是返回一个内存的地址 要注意 不能返回函数中局部变量的地址 这样的地址处于内存的堆栈区 是所有函数公用的区域 其中的数据是不稳定的 可能因为其他函数的执行而发生改变 2020 2 23 北京邮电大学信息与通信工程学院 64 例6 15一个指针函数完成一个数组的倒序 源数组由函数参数传递 倒序后的数组地址由指针函数返回 includeusingnamespacestd int reverse intconst list constintsize 指针函数 intresult 6 函数中定义的局部数组for inti 0 j size 1 i size i j result j list i returnresult 返回局部数组的地址 2020 2 23 北京邮电大学信息与通信工程学院 65 voidprintArray intconst list constintsize for inti 0 i size i cout list i voidmain intlist 1 2 3 4 5 6 int pList reverse list 6 获得倒序后数组的地址printArray pList 6 显示倒序后的数组 程序运行结果 858993460 858993460 858993460 858993460 8589934605结果完全不对 原因就在于指针函数返回的是函数局部数组的地址 2020 2 23 北京邮电大学信息与通信工程学院 66 例6 16对例6 15的修改 只要修改指针函数reverse 可以在函数这申请一个动态数组的地址 最后返回这个地址就可以 注意不要忘了用delete来释放这个地址 includeusingnamespacestd int reverse intconst list constintsize 指针函数 int result newint size 函数中定义的动态数组for inti 0 j size 1 i size i j result j list i returnresult 返回动态数组的地址 2020 2 23 北京邮电大学信息与通信工程学院 67 voidprintArray intconst list constintsize for inti 0 i size i cout list i voidmain intlist 1 2 3 4 5 6 int pList reverse list 6 获得倒序后数组的地址printArray pList 6 显示倒序后的数组deletepList 程序运行结果 654321 2020 2 23 北京邮电大学信息与通信工程学院 68 6 7 2用引用作为函数的返回值 返回引用有以下需要注意的地方 返回引用需要在函数的返回值类型中加以说明 形式为 返回引用实际是返回地址 在使用上 或者直接使用这个地址 或者使用这个地址单元的数据 返回的引用可以作为左值继续操作 而返回的变量值是不可以继续运算的 这是返回引用和返回变量值在使用上的主要区别 2020 2 23 例6 17引用作为函数的返回值 include includeusingnamespacestd structperson charname 15 intcontribution doublebonus 定义结构体personp1 LiLi 500 0 p2 ZhaoZhao 600 0 两名职工是全局变量person 2020 2 23 例6 17引用作为函数返回值 voidmain compare bonus 1000 返回值作为左值直接操作cout setw 10 p1 name p1 contribution p1 bonus endl cout setw 10 p2 name p2 contribution p2 bonus endl 程序运行结果 LiLi5000ZhaoZhao6001000 6 8指针和字符串 2020 2 23 71 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 72 6 8 1字符串处理的两种方式 C 字符串常量是用双引号括起的字符序列 并以字符 0 作为结束标志 如 Thisisastring 字符串常量存放在内存的某个区域 有自己固定的首地址 如果将字符串常量的首地址看成是指针 这种指针既是常指针 也是指针常量 2020 2 23 北京邮电大学信息与通信工程学院 73 6 8 1字符串处理的两种方式 C 处理字符串有两种方式 数组方式和指针方式 数组方式是将字符串存入字符数组后 再进行处理 一般可以在声明数组的时候用字符串来初始化 charstring array What saniceday 指针方式是用字符串常量来初始化一个字符指针 char string pt What saniceday 2020 2 23 北京邮电大学信息与通信工程学院 74 6 8 1字符串处理的两种方式 常量不能放在等式左边 运行时会出错 2020 2 23 北京邮电大学信息与通信工程学院 75 6 8 2字符串操作函数 调用这些函数时 原则上可以使用字符数组名 已经初始化的字符指针作为实参数 字符串常量还可以作为源字符串的实参数 目的串必须是可写的 2020 2 23 北京邮电大学信息与通信工程学院 76 例6 18strcpy和strncpy的比较 include includeusingnamespacestd voidmain intn char array1 HappyBirthdaytoYou chararray3 15 chararray2 25 strcpy array2 array1 cout Thestringinarray1is array1 nThestringinarray2is array2 n strcpy array3 array1 cout array3 endl n sizeof array3 strncpy array3 array1 n 1 复制array1的n 1个字符到array3array3 14 0 添加 0 到array3cout Thestringinarray3is array3 endl 不包括提示的运行结果HappyBirthdaytoYouHappyBirthdaytoYouHappyBirthday 复制array1到array2 没有问题 复制array1到array3 空间不够 有运行错误 按实际数组大小 复制array1到array3 没有问题 6 9通过指针访问数组 2020 2 23 77 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 78 通过指针访问数组 指针和数组有天然的联系 因为数组名本身就是地址 也就是某种类型的指针 将指针和数组名联系起来 访问数组就多了一种方法 虽然一维数组名和二维数组名都是地址 都可以看作是某种指针 但是指针的类型是不同的 因此 通过指针访问一维数组和二维数组的方法是不同的 2020 2 23 北京邮电大学信息与通信工程学院 79 6 9 1通过指针访问一维数组 要通过指针访问一维数组 必须首先声明一个和数组类型相同的指针 并且用数组名来对指针初始化 如 intA 10 pa A 然后 就可以用多种方式访问数组元素 数组名和下标 如A 0 A 4 指针和下标 如pa 0 pa 4 指针加偏移量的间接引用 如 pa 4 数组名加偏移量的间接引用 如 A 4 指针自加后的间接引用 如 pa 2020 2 23 北京邮电大学信息与通信工程学院 80 例6 19求数组内所存放的字符串的长度 includeusingnamespacestd voidmain charChArray Thisisastring ptch inti j k offset1 offset2 ptch ChArray 指针初始化for i 0 ChArray i 0 i cout Thelengthofthestringis i endl for j 0 ptch j 0 j cout Thelengthofthestringis j endl for offset1 0 ChArray offset1 0 offset1 cout Thelengthofthestringis offset1 endl for offset2 0 ptch offset2 0 offset2 cout Thelengthofthestringis offset2 endl for k 0 ptch 0 k cout Thelengthofthestringis k endl 运行结果都相同 方式1 数组名和下标 方式2 指针和下标 方式3 数组名加偏移量的间接引用 方式4 指针加偏移量的间接引用 方式5 指针自加的间接引用 2020 2 23 北京邮电大学信息与通信工程学院 81 例6 20求整型数组的平均值 显示数组元素和平均值 includeusingnamespacestd voidmain intintArray 10 8 11 23 34 45 56 65 78 86 97 ptint inti num sum floataverage ptint intArray sum 0 num sizeof intArray sizeof intArray for i 0 i num i sum sum ptint average float sum num ptint intArray cout 数组元素是 n for i 0 i num i cout ptint cout n平均值是 average endl 数组元素是 8112334455665788697平均值是 50 3 指针初始化 求数组元素的数目 求平均值 指针再次初始化 输出数组元素和它们的平均值 6 9 2指针数组 若数组元素是某种类型的指针 这样的数组称为指针数组 指针数组声明的格式如下 常量表达式 例如 char member name 10 注意和声明指向一维数组指针的差别 char member pointer 10 2020 2 23 82 北京邮电大学信息与通信工程学院 指针数组 指向字符的指针 char member name Merry John Hill 指向这样的指针数组的指针 char arr member name 或者 char arr arr member name 这样定义后 arr就是指向字符串的指针 以下语句cout arr endl 将显示数组中的第一个字符串 Merry 2020 2 23 83 北京邮电大学信息与通信工程学院 2020 2 23 北京邮电大学信息与通信工程学院 84 例6 21指针数组及其访问程序 includeusingnamespacestd voidmain char member name Merry John Hill cout Thenamelistshowas n for inti 0 i 3 i cout member name i n 程序运行结果 MerryJohnHill 2020 2 23 北京邮电大学信息与通信工程学院 85 例6 22通过使用结构体指针数组 完成结构体数组的排序 includeusingnamespacestd structEmployee charname 20 unsignedlongid floatsalary 定义结构体类型Employeeallone 6 zhang 12345 3390 0 定义结构体数组 wang 13916 4490 0 zhou 27519 3110 0 meng 42876 6230 0 yang 23987 4000 0 chen 12335 5110 0 2020 2 23 北京邮电大学信息与通信工程学院 86 voidmain Employee pA 6 总结 指针变量的特点是可变性 即一个指针变量内的地址是可变的 所以 通过一个指针变量 就可以访问一个数组 引用的特点是不变性 一个变量的引用就只能和这个变量联系在一起 彼此随着对方的变化而变化 函数调用的另一种方式 地址调用 具体又分为指针调用和引用调用 动态内存的使用 在程序中使用语句分配和释放内存空间 2020 2 23 87 北京邮电大学信息与通信工程学院
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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