资源预览内容
第1页 / 共98页
第2页 / 共98页
第3页 / 共98页
第4页 / 共98页
第5页 / 共98页
第6页 / 共98页
第7页 / 共98页
第8页 / 共98页
第9页 / 共98页
第10页 / 共98页
亲,该文档总共98页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1 第六章数组指针与字符串 C 语言程序设计 2 本章主要内容 数组指针指针与数组指针与函数动态存储分配字符串 3 数组的概念 数组是具有一定顺序关系的若干相同类型变量的集合体 组成数组的变量称为该数组的元素 因此当需要多个同类型变量时就要考虑定义数组 数组 4 数组的说明与使用 数组的声明一般形式 类型说明符标识符 常量表达式1 例如 inta 10 表示a为整型数组 有10个元素 a 0 a 9 数组 引用必须先声明 后使用 只能逐个引用数组元素 而不能一次引用整个数组例如 a 0 a 5 a 7 a 2 3 5 数组的说明与使用 数组 数组的使用使用数组时 只能分别对数组的各个元素进行操作 数组的元素是由下标来区分的 对于一个已经声明过的数组 其元素的使用形式为 数组名 下标表达式1 下标表达式2 使用数组注意 1 数组元素的下标表达式可以是任意合法的算术表达式 其结果必须为整型数 2 数组元素的下标值不得超过声明时所规定的上下界 否则运行时数组越界错误 6 例 给出下面程序的输出结果 includeintcount 5 1 2 voidmain inti charc hello for i 0 i 4 i cout count i endl cout c endl cout sizeof c endl cout count endl cout sizeof count endl cout sizeof count sizeof int endl 运行结果为 1 count 0 2 count 1 0 count 2 0 count 3 0 count 5 hello 输出字符串c7 字符串c长度为70 x00408040 数组count首地址20 数组count占总字节数5 数组count元素个数 7 一维数组的存储顺序 数组元素在内存中顺次存放 它们的地址是连续的 例如 具有10个元素的数组a 在内存中的存放次序如下 数组名字是数组首元素的内存地址 数组名是一个常量 不能被赋值 数组 8 一维数组的初始化 可以在编译阶段使数组得到初值 在声明数组时对数组元素赋以初值 可以只给一部分元素赋初值 在对全部数组元素赋初值时 可以不指定数组长度 数组 例如 staticinta 10 0 1 2 3 4 5 6 7 8 9 例如 staticinta 10 0 1 2 3 4 例如 staticinta 1 2 3 4 5 9 二维数组的声明及引用 数据类型标识符 常量表达式1 常量表达式2 例 inta 5 3 表示a为整型二维数组 其中第一维有5个下标 0 4 第二维有3个下标 0 2 数组的元素个数为15 可以用于存放5行3列的整型数据表格 数组 存储顺序按行存放 上例中数组a的存储顺序为 二维数组的声明类型说明符数组名 常量表达式 常量表达式 例如 floata 3 4 引用例如 b 1 2 a 2 3 2 下标不要越界 二维数组的声明及引用 数组 分行给二维数组赋初值例如 staticinta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 将所有数据写在一个 内 按顺序赋值例如 staticinta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 可以对部分元素赋初值例如 staticinta 3 4 1 0 6 0 0 11 二维数组的初始化 数组 12 数组作为函数参数 数组元素作实参 与单个变量一样 数组名作参数 形 实参数都应是数组名 类型要一样 传送的是数组首地址 对形参数组的改变会直接影响到实参数组 数组 13 例6 2使用数组名作为函数参数 例 主函数中初始化一个矩阵并将每个元素都输出 然后调用子函数 分别计算每一行的元素之和 将和直接存放在每行的第一个元素中 返回主函数之后输出各行元素的和 数组 includevoidRowSum intA 4 intnrow intsum for inti 0 i nrow i sum 0 for intj 0 j 4 j sum A i j cout Sumofrow i is sum endl voidmain void intTable 3 4 1 2 3 4 2 3 4 5 3 4 5 6 for inti 0 i 3 i for intj 0 j 4 j cout Table i j cout endl RowSum Table 3 运行结果 123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is18 17 对象数组 声明 类名数组名 元素个数 访问方法 通过下标访问数组名 下标 成员名 数组 18 对象数组初始化 数组中每一个元素对象被创建时 系统都会调用类构造函数初始化该对象 通过初始化列表赋值 例 PointA 2 Point 1 2 Point 3 4 如果没有为数组元素指定显式初始值 数组元素便使用缺省值初始化 调用缺省构造函数 数组 19 数组元素所属类的构造函数 不声明构造函数 则采用缺省构造函数 各元素对象的初值要求为相同的值时 可以声明具有缺省形参值的构造函数 各元素对象的初值要求为不同的值时 需要声明带形参 无缺省值 的构造函数 当数组中每一个对象被删除时 系统都要调用一次析构函数 数组 20 例6 3对象数组应用举例 Point h ifndef POINT H define POINT HclassPoint public Point Point intxx intyy Point voidMove intnewX intnewY intGetX returnx intGetY returny staticvoidshowCount private intx y endif 数组 Point cpp include include Point h usingnamespacestd Point Point x y 0 cout DefaultConstructorcalled endl Point Point intx inty x x y y cout Constructorcalled endl Point Point cout Destructorcalled endl voidPoint Move intnewX intnewY cout Movingthepointto newX newY endl x newX y newY 6 3 cpp include Point h includeusingnamespacestd intmain cout Enteringmain endl Pointa 2 for inti 0 i 2 i a i Move i 10 i 20 cout Exitingmain endl return0 运行结果 Enteringmain DefaultConstructorcalled DefaultConstructorcalled Movingthepointto 10 20 Movingthepointto 11 21 Exitingmain Destructorcalled Destructorcalled 25 关于内存地址 内存空间的访问方式通过变量名访问通过地址访问地址运算符 则 var表示变量var在内存中的起始地址 指针 26 声明例 staticinti staticint i pointer 指向整型变量的指针 指针变量的概念 概念指针 另一个变量的地址 用于间接访问变量指针变量 用于存放地址的变量 引用例1 i 3 例2 i pointer 3 指针 27 与地址相关的运算 和 指针运算符 表示指针所指向的变量的值 指针 28 与地址相关的运算 和 如果已经执行了inta b int point 1 point 2 point 1 1 point 1的含义 2 a的含义 指针 2 a与 point 1的作用是一样的 它们等价于变量a 即 a与a等价 29 指针变量的初始化 语法形式存储类型数据类型 指针名 初始地址 例 int pa 指针 注 存储类型是指数据在内存中存储的方式 分为两类 静态存储类和动态存储类 具体包含四种 自动的 auto 静态的 static 寄存器的 register 外部的 extern 自动的 auto 可以省略 注意事项 1 用变量地址作为初值时 该变量必须在指针初始化之前已说明过 且变量类型应与指针类型一致 2 可以用一个已赋初值的指针去初始化另一个指针变量 30 指针变量的赋值运算 指针名 地址 地址 中存放的数据类型与指针类型必须相符 向指针变量赋的值必须是地址常量或变量 不能是普通整数 但可以赋值为整数0 表示空指针 指针的类型是它所指向变量的类型 而不是指针本身数据值的类型 任何一个指针本身的数据值都是unsignedlongint型 允许声明指向void类型的指针 该指针可以被赋予任何类型对象的地址 例 void general 指针 31 例6 5指针的声明 赋值与使用 includeusingnamespacestd voidmain inti int ptr 指针 取i的地址赋给ptr 输出int型数的值 输出int型指针所指地址的内容 程序运行的结果是 i 10 ptr 10 33 几种特殊的指针类型 指针 1 可以声明指向常量的指针 此时不能通过指针来改变所指对象的值 但指针本身可以改变 可以指向另外的对象 例 P164例 intn1 3 intconstn2 5 constint pn 正确 错误 34 指针 2 可以声明指针类型的常量 这时指针本身的值不能被改变 例 P164例 intn1 3 intconstn2 5 int constpn 正确 35 例6 6void类型指针的使用voidmain voidvodObject 错 不能声明void类型的变量void pv 对 可以声明void类型的指针inti 5 pv 指针 void类型指针指向整型变量 void指针赋值给int指针需要类型强制转换 3 一般情况下 指针的值只能赋给相同类型的指针 但是有一种特殊的void类型指针 可以存储任何类型的对象地址 36 指针运算 指针与整数的加减运算指针p加上或减去n 其意义是指针当前指向位置的前方或后方第n个数据的地址 这种运算的结果值取决于指针指向的数据类型 指针 37 指针变量的算术运算 指针加一 减一运算指向下一个或前一个数据 例如 y px 相当于y px 相当于y px px 指针 后置 运算符优先级高于 详细分析 px 相当于 px 但 px 的值为px 因而 与px结合成 px 继续运算将 px的值赋值给y 表达式运算结束后 再为px值增1 pa pb 1 pb pb 1 pb 2 pb 1 pb pb 1 pb 2 long pb 40 关系运算指向相同类型数据的指针之间可以进行各种关系运算 指向不同数据类型的指针 以及指针与一般整数变量之间的关系运算是无意义的 指针可以和零之间进行等于或不等于的关系运算 例如 p 0或p 0赋值运算向指针变量赋的值必须是地址常量或变量 不能是普通整数 但可以赋值为整数0 表示空指针 指针变量的关系运算 指针 41 用指针处理数组元素 声明与赋值例 inta 6 10 20 30 40 50 60 pa pa 当指针变量指向该数组后可以通过指针引用数组元素 指针 42 由此可见如下的等价关系成立 pa a a 0 表示数组元素的首地址pa i a i a i 表示第i 1个数组元素的地址 pa i a i a i 表示第i 1数组元素 指针 访问数组元素的三种方式 1 下标方式形式 数组名 下标 2 地址方式形式 地址 3 指针方式形式 指针变量 注意 1 pa与a的区别 两者同样是表示数组a的地址 但本质不同 pa是变量 而a是常量 所以对pa进行pa pa 等赋值运算
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号