第3章 数组与指针_第1页
第3章 数组与指针_第2页
第3章 数组与指针_第3页
第3章 数组与指针_第4页
第3章 数组与指针_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章数组与指针 本章内容 数组指针指针与数组指针数组动态存储分配 为什么要使用数组 问题 一个班有5名学生 现在需要将每个学生的成绩作调整 调整公式为 新成绩 10 sqrt 原成绩 使用数组 include includevoidmain doubles 36 54 72 80 95 for inti 0 i 5 i s i 10 sqrt s i 如果这个班有50名学生 未使用数组 include includevoidmain doubles1 36 s2 54 s3 72 s4 80 s5 95 s1 10 sqrt s1 s2 10 sqrt s2 s3 10 sqrt s3 s4 10 sqrt s4 s5 10 sqrt s5 数组的概念 数组是具有一定顺序关系的若干相同类型变量的集合 数组元素数组中的每个变量称为数组元素 数组的类型数组中数组元素的类型 数组的维数数组中各元素之间的相对位置由下标确定 如果用一个下标就可以确定元素的位置 称为一维数组 用两个下标确定 称为二维数组 一维数组的声明 一维数组的声明形式为 类型数组名 常量表达式 例如 inta 10 表示a为整型数组 有10个元素 a 0 a 1 a 9 常量表达式的值为数组元素的个数 一维数组元素的引用 数组在使用前必须先声明 只能逐个引用数组元素 而不能一次性地引用整个数组 例如 inta 5 a 0 12 a 1 30 a 2 a 0 a 1 一维数组元素的引用 将数组中所有元素置0intarray 5 for inti 0 i 5 i array i 0 一维数组的初始化 将所有数据写在一个 内 按顺序赋值inta 5 5 10 15 0 0 可以省略数组大小inta 5 10 15 0 0 可以对部分元素赋初值inta 5 5 10 15 一维数组的存储方式 数组元素在内存中顺次存放 它们的地址是连续的 例如 inta 5 声明具有5个元素的整型数组a它的存储结构示意图如下 数组名字是数组首元素的内存地址 数组名是一个常量 不能被赋值 用数组来处理求Fibonacci数列问题 intmain inti intf 20 0 1 初始化第0 1个数for i 2 i 20 i f i f i 2 f i 1 求第2 19个数for i 0 i 20 i 输出 每行5个数if i 5 0 cout endl cout width 10 设置输出宽度为10cout f i cout endl return0 运行 例 求10个数的总和及平均值 includeusingnamespacestd intmain intarray 10 65 87 90 80 84 85 53 46 95 70 intsum 0 average for inti 0 i 10 i sum array i average sum 10 0 cout 总和 sum endl cout 平均值 average endl return0 运行 例 求数组中的最大值 includeusingnamespacestd intmain intarray 10 max i cout array i 不能写成 cin array max array 0 for i 1 imax max array i cout 最大值 max endl return0 运行 冒泡排序第一趟 例 将十个整数按由小到大顺序排列 includeusingnamespacestd intmain intx 10 65 87 90 80 84 85 53 46 95 70 i j temp for i 0 ix j 1 x j 与x j 1 交换temp x j x j x j 1 x j 1 temp for i 0 i 10 i cout x i cout endl return0 运行 includevoidmain inta 10 for inti 0 i a i inttemp for i 0 ia j 1 temp a j a j a j 1 a j 1 temp 冒泡排序 第一趟 第三趟 第四趟 第二趟 第五趟 第六趟 初始状态 includevoidmain inta 10 for inti 0 i a i boolchange true inttemp for i 0 ia j 1 temp a j a j a j 1 a j 1 temp change true 标志置为真 有交换 求一维数组的元素个数 sizeof 数组名 的值是该数组对应的存储单元数 例 inta 1 2 3 4 5 n n sizeof a sizeof int 二维数组定义及元素引用 二维数组的定义形式为 类型名数组名 常量 常量 例如 int 3 4 定义了一个3行4列的整形数组 行元素个数 列元素个数 二维数组元素的引用 二维数组的元素也只能逐个引用 而不能一次性的引用整个数组 二维数组元素的引用形式为 数组名 行下标 列下标 例如 0 0 1 2 等 二维数组定义及元素引用 数组 3行4列 的逻辑结构排列顺序如下 0 0 x 0 1 x 0 2 x 0 3 行 1 0 x 1 1 x 1 2 x 1 3 行 2 0 x 2 1 x 2 2 x 2 3 行 0列1列2列3列 0 1 2 3 4 5 6 7 8 9 10 11 6664727885909910098908880 row2 col7也许是王刚的数学成绩 行列 例 在一个数组中保存50个同学12门功课的成绩 constintNUM STUDENTS 50 constintNUM COURSE 12 intSCORES NUM STUDENTS NUM COURSE 0 1 2 SCORES 2 7 48 49 二维数组的存储结构 在内存中 C 按行优先方式存储二维数组 即 第二行紧跟着第一行 依次类推 Viewedanotherway SCORES 0 0 SCORES 0 1 SCORES 0 2 SCORES 0 3 SCORES 0 4 SCORES 0 5 SCORES 0 6 SCORES 0 7 SCORES 0 8 SCORES 0 9 SCORES 0 10 SCORES 0 11 SCORES 1 0 SCORES 1 1 SCORES 1 2 SCORES 1 3 为了定位一个元素 例如SCORES 2 7 编译系统需要知道这个二维数组共有12列 怎样找到SCORES 2 7 的地址 假设一个int类型占4bytes 首地址8000 多维维数组的声明形式为 类型名数组名 常量 常量 例如 int 3 4 5 声明了一个三维数组该三维数组的第一个元素为 x 0 0 0 最后一个元素为 x 2 3 4 元素总个数为 3 4 5 60 多维数组声明及元素引用 constintNUM DEPTS 5 mens womens childrens electronics furnitureconstintNUM MONTHS 12 constintNUM STORES 3 WhiteMarsh OwingsMills TowsonintmonthlySales NUM DEPTS NUM MONTHS NUM STORES monthlySales 3 7 0 salesforelectronicsinAugustatWhiteMarsh 12MONTHScolumns 5DEPTSrows 3STORESsheets 二维数组的初始化 将所有数据写在一个 内 按顺序赋值例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 分行给二维数组赋初值例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 可以省略行下标值 但列下标值不能省略例如 inta 4 1 2 3 4 5 6 7 8 9 10 11 12 可以对部分元素赋初值例如 inta 3 4 1 0 6 0 0 11 对于二维数组 通常使用二重循环结构控制其行列下标以访问数组中的每个元素 例 向二维数组array中输入数据 并输出该二维数组 includeusingnamespacestd intmain intarray 5 5 i j cout array i j cout 按行输出数组 n for i 0 i 5 i for j 0 j 5 j cout array i j cout endl 输出每行后换行 return0 执行程序 按行输入5行5列数组 1234523456345674567856789按行输出数组1234523456345674567856789 例 已知5名学生某门课的成绩 输出平均成绩及高于平均成绩的学生的学号和成绩 定义一个二维数组a 每一行对应于一个学生的信息 第一列存放学号 第二列存放成绩 includeusingnamespacestd intmain constintN 5 inta N 2 1 65 2 87 3 90 4 80 5 70 intsum 0 ave for inti 0 iave cout a i 0 a i 1 endl return0 运行 字符型数组 在 中常用字符型数组来处理字符串 给字符型数组赋字符串时 每个数组元素存放一个字符 给字符型数组赋字符串时定义的长度要比实际字符个数多 以存放字符串结束符 0 ASCII码值为0的字符NULL 字符数组的初始化 以下几种初始化形式是等效的 charch total 最常用的形式charch 6 total charch total charch 6 t o t a l 0 charch 6 ch total 不允许 当字符数组定义的空间大于初始化字符串长度时 剩余的空间填充 0 例如 charstr 15 IloveC str数组中存放的是 字符数组的初始化 字符数组的初始化 二维字符型数组初始化时 可以用以下几种形式 结果是等效的 chars1 3 5 b o o k 0 p e n 0 b a g 0 chars2 3 5 book pen bag chars3 5 book pen bag chars4 5 book pen bag 例 统计一个字符串中字符的个数 includeusingnamespacestd intmain charstr C ProgrammingToday intcount 0 i 0 while str i 0 或写成while str i count i cout 字符个数 count endl return0 运行 字符串的输入 输出 将整个字符串一次输入或输出用cin和cout输入 输出字符串时 只写数组名 例如 charstr 10 cin str 将从键盘输入的字符串存入字符数组中cout str 字符串的输入 输出 续 用cout输出字符串时 遇到第一个 0 输出结束 0 不输出 charch 6 t o t a l 0 cout ch endl 如果遇不到 0 会输出乱码charch 5 t o t a l cout ch endl 会出现乱码 烫 字符串的输入 输出 续 用cin 进行字符串输入时 当遇到空格 制表符或回车时 输入结束 并在最后加一个 0 字符 例如 charstr 10 cin str 执行时若从键盘输入 Howareyou 内存中变量str的内容是 尾部追加空字符null 0 整行输入字符串 若输入含有空格或制表符的字符串时 可以用函数 gets get getline 整行输入字符串 cin getline str n 一次连续读取多个 n 1个 字符 包括空格 存放于字符数组str中当读取完n 1个字符停止读取 如果在读取n 1个字符之前遇到 n 回车 字符 则提前停止读取getline在字符数组尾部追加空字符 0 使用getline 示例 charstr 10 cin getline str 10 输入最多9个字符执行时若从键盘输入 IloveC 执行时若从键盘输入 IloveC 指针 指针是C 语言的重要内容 它提供了一种直观的地址操作方法 利用指针可以直接对内存中的各种不同数据结构的数据进行快速有效处理 可以为函数间各种数据的传递提供了简捷 便利的方法 使用指针 可以方便 灵活 有效的组织和表示复杂的数据结构 指针使用不当 将可能导致系统崩溃 内存 地址和指针 几个概念 程序中用到的数据都要保存到计算机的内部存储器中 计算机的内部存储器是由很多个存储单元组成的 每个存储单元都有一个编号 这个编号称为存储单元的地址 计算机通过这个地址来读写单元中的数据 在计算机中 变量的地址指示了该变量在内存中的位置 形象的称地址为指针 内存 地址和指针 一台计算机的内存是若干个字节的序列 可以将这些字节从0到最后一个编号 这个编号称为存储单元的地址 将这种 一个指出在内存中位置的数字 称为指针 存储单元也可以存放地址 专门用于存放内存单元地址的变量 称为指针变量 指针变量中存放的不是一般的数据 而是另一个变量在内存中的地址 intvar 17 int ptr 声明一个指向int的指针ptr 输出是1717 关于内存地址 内存空间的访问方式通过变量名访问通过地址访问地址运算符 则 var表示变量var在内存中的起始地址间接访问运算符 指针变量的概念 指针 一个特殊类型的变量指针 内存地址 用于间接访问内存单元指针变量 用于存放另一个变量的地址intnum 5 createsanormalintint intPtr createsaintpointerintPtr 内存 地址和指针 intvar 17 int ptr 声明一个指向int的指针ptr 输出是1717 注意 的区别 指针变量的声明和使用 指针变量的声明形式为 类型 指针变量名1 指针变量名1 例如 int pi pi存储一个整型变量的地址 char pc pc存储一个字符型变量的地址double pd pd存储一个双浮点型变量的地址指针的类型就是它所指向的数据类型 指针变量占用内存 4个字节 指针变量的声明和使用 inti j 6 int p p 将3赋给指针p所指变量 即i中 注意 的区别 注意 用变量地址作为初值时 该变量必须在指针初始化之前已说明过 且变量类型应与指针类型一致 inta pp a 或inta p a 注意 指针与所指变量类型应相同 如 inta double p 错误 注意 可以用一个已赋初值的指针去初始化另一个指针变量 同类型的指针之间可以互相赋值doublex 6 78 double p1 注意事项 向指针变量赋的值必须是地址常量或变量 不能是普通整数 但可以赋值为整数0 表示空指针 即该指针变量不指向任何变量 例 int p q p 0 正确 空指针q NULL 正确 空指针q 200 错误 编译器不会将一般整数常量理解为地址 指针使用示例 intmain inta 10 int p1 p2 执行结果 a 10 p1 10 p2 1030a 200 x0065FDF40 x0065FDF40 x0065FDF4 指针的运算 指针变量可以参与运算 若p q为指向相同类型数据的指针 p q之间可以进行各种关系运算 允许的运算包括 p q指针间赋值 p p 或 p p指针自增 或自减 p n或p n指针加上或减去一个整数p q指针相减 p q指针关系运算p 0或p 0 理解指针的运算 指针与整数的加减运算p n p n指针p加上或减去n其意义是指针当前指向位置的前方或后方第n个数据的地址 这种运算的结果值取决于指针指向的数据类型 指针加一 减一运算p 1或p 1指向下一个或前一个数据 理解指针的运算 C 允许指针变量加或减一个整数 即 例如 inta p 假设变量a的地址是0 x1004 则指针p 1 a 理解指针的运算 换句话说 指针p当前所指位置后面 前面n个数据的地址 相当于 int pb 理解指针的运算 理解指针的运算 理解指针的运算 地址编号 0 x1000 0 x1004 0 x1008 0 x100c 0 x1010 若inta p 执行p 后将导致的变化如右图 a 指针与数组 在C 中指针与数组关系非常密切 指针可以指向数组元素 任何由数组下标完成的操作都可以用指针实现 它们都可以处理内存中连续存放的数据 一维数组与指针 例如有如下定义 intarray 5 1 3 5 7 9 p array array i array ip i array i array i p i p i PP 1P 2P 3P 4 下标表示法 地址表示法 指针表示法 第i个元素的值表示方法有以下四种 第i个元素的地址表示方法有以下三种 对于一维数组来说 数组名实质上是指向数组首元素的常量指针 一维数组与指针 intarray 5 1 3 5 7 9 p array PP 1P 2P 3P 4 指针可以指向数组元素 Intmain inta 5 10 20 30 40 50 i int p a 等价于int p 例 访问数组元素 例 访问数组元素的几种方式 intmain inta 5 10 20 30 40 50 i int p for i 0 i 5 i cout a i 使用数组名和下标cout endl for i 0 i 5 i cout a i 使用数组名指针运算cout endl for p a p a 5 p cout p 使用指针变量cout endl return0 运行 指向数组元素的指针 例 intax 5 p p ax 2 p 3 p 2 5 p 2 1 通过指针访问位于数组范围之外的数据时非法的 一维数组与指针 如果两个指针变量指向同一个数组的元素 则这两个指针变量可以相减 结果是两个指针间元素的个数 如果两个指针变量指向同一个数组的元素 则这两个指针变量可以比较 例 inta 5 1 2 3 4 5 p q p 输出结果 3 理解指针的运算 a 0 a 1 a 2 a 3 a 4 q p q p 如果两个指针变量指向同一个数组的元素 理解指针的运算 a 0 a 1 a 2 a 3 a 4 q p q p q p是两个指针间元素的个数 true q p为3 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p 12345 a 0 a 1 a 2 a 3 a 4 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 一维数组与指针 可以让一个指针变量指向数组中的某个元素 以后通过这个指针访问数组元素 例 inta 5 1 2 3 4 5 ints 0 p for p a p a 5 p s p p a 0 a 1 a 2 a 3 a 4 12345 例 将数组a中的数据重新按逆序存放 然后输出 intmain inta 10 65 87 90 80 84 85 53 46 95 70 int p a q 运行 使用指针应注意 数组名是数组首地址 是常量 因此若定义 inta 10 p a p a 3 正确a 错误用指针处理数组时 指针移动的值不要超过数组元素下标定义的范围 否则越界 使用指针应注意 当指针运算符与其他运算符联合使用时 要注意运算符的优先级别 例如 p 相当于 p 取 所指内容后 p指针加 p 指针加 后所指的内容 p 将所指向的单元内容加 p 将所指向的单元内容加 例 指针与数组使用示例 intmain intx 4 10 20 30 40 int p x cout p p等价于 p cout p p 等价于 p cout p p等价于 p cout p cout p endl return0 执行结果 2020313132 数组x 10203240 字符指针与字符数组 在 中字符串用字符型数组或字符型指针处理 将一个字符串赋给一个字符型指针时 该指针指向字符串的首地址 即第一个字符的地址 例如 char pstr Tianjin cout pstr endl 然后通过指针的算术运算实现对字符串的访问 voidmain charstr Helloworld char ps1 str char ps2 alittledog cout str endl cout ps1 endl cout ps2 endl cout str endl cout ps2 endl ps1 ps2 2 cout ps1 endl ps1 Iamastring cout ps1 5 endl 字符指针与字符数组举例 Helloworld Helloworld alittledogHalittledogastring 运行结果 字符数组和字符指针的区别 字符数组只能在初始化时为整体赋值 不能在程序中向数组名赋值 而字符指针除初始化外 还可以在程序中赋字符串 例如 charstr 10 pstr str Tianjin 出错 s为地址常量 不能出现在 左侧pstr Tianjin 正确 p为指针变量 可以出现在 左侧 字符数组和字符指针的区别 输入一个字符串charstr 10 cin str 不能这样char pstr cin pstr 应这样charstr 10 pstr str cin pstr 将用户的输入写入到pstr指向的地方 将用户的输入写入到pstr指向的地方 此时指向哪里不确定 字符数组和字符指针的区别 对于字符数组 编译程序根据定义数组时的大小分配存储空间charcity Tianjin 按元素个数分配8个字节而对于字符指针 仅给该指针变量分配存放一个地址的单元 该单元可以存放任一字符串的首地址 char pCity Tianjin 占用固定大小空间 4个字节 sizeof city sizeof pCity 结果为8 结果为4 T i a n j pCity i n 0 字符指针与字符数组 charcity Tianjin char pCity Tianjin cout city endl 输出Tianjincout pCity endl 输出Tianjincout city 1 endl 输出icout city 1 endl 输出icout pCity 1 endl 输出icout pCity 1 endl 输出i 字符指针与字符数组 T i a n j pCity i n 0 charcity Tianjin char pCity Tianjin city 0 t 正确 city 0 t pCity 0 t 出错 pCity 0 t 一般用字符数组存放字符串 而用字符指针实现对字符串的处理 因为使用字符指针更灵活 例 实现两字符串的连接 voidmain chars1 20 abc s2 xyz inti 0 j 0 while s1 i 寻找s1字符串的结束位置i while s2 j 将s2字符串逐个复制到s1后s1 i j s2 j j s1 i j 0 不要忘记在结果串后加空字符 0 cout s1 endl 例 实现两字符串的连接 例 实现两字符串的连接 voidmain chars1 20 abc s2 xyz ps1 s1 intj 0 while ps1 寻找s1字符串的结束位置ps1 while s2 j 将s2字符串逐个复制到s1后 ps1 s2 j ps1 j ps1 0 不要忘记在结果串后加空字符 0 cout s1 endl 存放连接结果的数组应足够大 例 实现两字符串的连接 intmain chars1 20 abcde s2 xyzf ps1 s1 intj 0 while ps1 寻找s1字符串的结束位置ps1 while s2 j 将s2字符串逐个复制到s1后 ps1 s2 j ps1 j ps1 0 cout s1 endl return0 运行 二维数组与指针 二维数组可以看作是一维数组的数组 例如 有如下定义 inta 3 4 a数组可以看作是由a 0 a 1 a 2 这3个元素组成的一维数组 a 0 a 1 a 2 又分别是3个一维数组 有4个元素 的数组名 数组可表示为 概念上存在的一维数组 二维数组 数组的数组 inta 3 4 arrayofintarrays a 0 a 1 a 2 a a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 二维数组 数组的数组 inta 3 4 arrayofintarraysa 0 a 0 a 1 a 2 a a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 二维数组 数组的数组 inta 3 4 arrayofintarraysa 0 1 a 0 a 1 a 2 a a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 理解二维数组与指针 指向数组的指针 数组元素a i j 的地址 a i j a i j a i j 访问数组元素的方式a i j a i j a i j 以下关系成立 a a 0 a 0 a 0 0 a 1 a 1 0 a 2 a 2 0 a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 理解二维数组与指针 指向数组的指针 例 求二维数组a每行元素之和 intmain inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 ints i j for i 0 i 3 i s 0 for j 0 j 4 j s a i j 等价形式 s a i j 或s a i j cout s endl return0 运行 行指针 二维数组还可以使用行指针进行处理 行指针定义形式如下 类型名 指针名 列长度 例 inta 3 4 int p 4 a 不能写成int p 4 a 0 p p 1 includevoidmain intx 3 4 1 2 3 4 5 6 7 8 9 10 11 12 int px 4 x s i j for i 0 i 3 i s 0 for j 0 j 4 j s px i j cout i 行 s endl 例 用行指针计算二维数组各行的平均值 利用二维数组在内存中连续存放的特点 即二维数组在内存中仍按一维方式存放 前例 求二维数组a每行元素之和还可这样写 intmain inta 3 3 1 2 3 4 5 6 7 8 9 ints i p a 0 while p a 0 9 s 0 for i 0 i 3 i s p i 也可写成 s p i cout s endl p p 3 return0 例 将输入的年 月 日转换为本年度的第几天 voidmain intdate 13 0 31 28 31 30 31 30 31 31 30 31 30 31 0 31 29 31 30 31 30 31 31 30 31 30 31 inty m d yd p i j cout y m d p date 0 i y 4 0 指针数组 指针数组即数组中的每个元素都是同类型的指针变量 或称由指针构成的数组 指针数组的定义 类型 数组名 元素个数 例 int s 2 由s 0 s 1 两个指针组成 指针数组 指针数组即数组中的每个元素都是同类型的指针变量 或称由指针构成的数组 指针数组的定义 数据类型 数组名 元素个数 例 int s 4 定义整型指针数组char ch 5 定义字符型指针数组 例 char pc C Pascal Fortran 字符指针数组的初始化 例 charpc 8 C Pascal Fortran 可以用二维数组处理多个字符串 用二维数组处理多个字符串不如指针数组省空间 例3 18 用字符型指针数组编写程序 当输入 12中某个值时 输出对应的月份 输入月份 1 12 88 August 第一次运行程序 输入月份 1 12 1313 illegalmonth 第二次运行程序 例3 18 用字符型指针数组编写程序 当输入 12中某个值时 输出对应的月份 include voidmain char month illegalmonth January February March April May June July August September October November December char find intn cout n find n12 month 0 month n cout n find endl 动态申请内存与释放 程序中定义的变量 数组 其对应的空间由系统在编译时分配 若在编写程序时 有些数据空间的大小不能确定 只有在程序运行时才能确定 可以安排在程序运行时根据需要动态申请内存空间 动态内存分配技术使用new和delete两个运算符 运算符new用于申请一块动态空间 用new申请的空间不需要时使用运算符delete释放 Thecomputer smemory AsaprogramseesitLocalvariables livesonthestack Globalvariablesare staticdata Theexecutablecodearein thecodesection 动态申请内存运算符new 使用格式 指针 new数据类型名 指针 new数据类型名 初始值 作用 在程序运行期间 从堆内存区域动态申请指定数据类型所需的内存空间 若分配成功 新分配的内存的首地址赋给指针 否则 指针得到一个空地址0 NULL 用new运算符动态分配一个变量的内存空间 一个元素int p1 newint get allocate anewuninitializedintint p2 newint 5 getanewintinitializedto5 5 p2 p1 格式 指针 new数据类型 元素个数 例 int q newint 5 创建5个元素的整型数组int p newint n 创建n个元素的整型数组 n个元素的整型数组 用new运算符动态分配一块连续的数组空间 通过指针访问数据 数组int p3 newint 5 get allocate 5intsp3 0 7 p3 1 9 intx2 p3 1 getthevalueofthe2ndelementofp3intx3 p3 wecanalsousethedereferenceoperator foranarray p3meansp3 0 andviceversa 7 9 p3 Apointerdoesnotknowhowmanyelementsitpointsto 释放内存运算符delete 作用 释放用new创建的动态存储单元 两种格式 delete指针名 释放由new分配给单个对象的内存delete 指针名 释放由new分配给数组对象的内存例如 int pi newint 5 deletepi char pc newchar 20 delete pc 一个问题 指针悬挂 delete运算符只释放动态申请到的内存单元 并不删除指针 安全的做法是将指针变量

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论