




已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+实用教程,章韵等,第四章数组和指针,高等教育出版社,第四章数组和指针,4.1数组,4.4结构体,4.3字符串,4.2指针,4.5枚举类型,4.6引用类型,4.1数组,由具有各类特殊功能的信息(程序)组成,1.计算机系统,计算机系统,计算机的实体,如主机、外设等,一、计算机的软硬件概念,4.1数组,数组是由数目固定、类型相同的若干个变量组成的有序集合,该集合的名字称为数组名,每个变量称为数组的元素。通常用数组名和下标来表示数组中的某个元素,因此数组中的元素也称为下标变量。可以像基本数据类型的变量一样对数组中的元素赋值或将其应用于其它表达式中。数组按维数的不同可分为一维数组和多维数组;按数组元素的类型不同可分为整型数组、浮点型数组、字符数组等。,一、一维数组的定义和使用1.一维数组的定义定义一维数组的一般格式:存储类型;数组名后的方括号称为数组下标运算符,其内部的必须为正整数,它表示该数组所能容纳元素的最大数目。数组定义中的必须由字面常量、const类型的常量或宏定义的标识符构成,不能含有变量,且它的值一定要为正整数,4.1,在定义数组的同时,可以对数组中的元素赋初值,称为数组的初始化。通常用初始值表实现。数组的初始化有如下几种形式:(1)在初始值表中给出数组中各元素的初始值。(2)在初始值表中给出数组中部分元素的初始值,此时系统自动将其它元素置0,此时初始值表不能为空。(3)在定义数组时,不直接指定数组的大小。此时编译系统会根据初始值表中元素的个数来确定数组的大小,4.1,2一维数组的应用编译系统为数组分配连续的内存空间。数组中的每个元素都有一个确定的序号来表示它在内存中的位置,该序号是从零开始的。通过该序号可以引用数组中每一个元素,其一般格式如下:;其中是一个值为非负整数表达式,其值表示该元素的在数组中的序号,称为元素的下标,在引用数组中的元素时,要避免下标越界。,4.1,数组中的元素与普通的变量在使用上没有太大区别,可以对它们赋值,也可将它们参与其它运算。一维数组所占用内存空间的大小为:sizeof()=数组大小*sizeof(),4.1,二、多维数组的定义和使用1.二维数组的定义二维数组的定义格式:存储类型;其中,称为数组的行数,称为数组的列数。二维数组中元素的个数为:*。,4.1,在引用二维数组中的元素时,要指明该元素在二维数组中所处的行号和列号。表示二维数组中元素的一般格式为:;其中和分别表示该元素所在的行和列,称为行下标和列下标。二维数组可以看作一维数组的直接推广。二维数组中的元素在存储器中的排列规则是:先按行进行存放,每一行中的元素再按其列下标从小到大进行排列。,4.1,2.二维数组的初始化对二维数组的初始化有如下几种方法:(1)以行为单位,对数组中的元素进行初始化。(2)用类似于一维数组初始化的方式对二维数组进行数组进行初始化。(3)在定义二维数组时不指定数组的行数,此时必须对该数组进行初始化,系统将根据初始化的数据,自动确定数组的行数。注意,此时不能省略数组的列数。,4.1,3.二维数组的应用例设计一个程序,定义一个4行5列的二维数组并初始化,求出数组中元素的平均值、最大元素、最小元素以及最大元素和最小元素的位置(行号和列号)。例已知三行二列的矩阵a与二行三列矩阵b,求这两矩阵的积c=ab。,4.1,4.2指针,一、指针变量的说明每一个存储单元都有唯一的一个编号与其对应,该编号称为相应存储单元的地址。编译系统在对一个变量进行操作时,都是通过寻找其相应的地址而实现对相应的存储单元中的内容进行操作。可以用取地址运算符“计算机的实际处理如下:=sizeof()*n;指针的+、-运算与上述运算类似。,4.2,3.指针变量的关系运算通常只进行同类型的变量之间的关系运算,对于不同类型指针之间的关系运算意义不大。常用的指针变量的关系运算包括:判断一个指针是否为空:=0;判断两个指针是否指向同一个存储单元:=;比较两个指针变量的大小等。,4.2,三、指针与数组指针和数组有许多相通的地方,比如数组名就是可以看成是一个指针,而对于指针变量,也可以使用数组的下标运算符。数组的起始地址称为数组的指针,而将指向数组元素的指针变量称为指向数组的指针变量。利用指向数组的指针变量来处理数组中的元素是一种常用的方法。,4.2,1.一维数组与指针在声明一个一维数组之后,该数组名就可以作为一个指针使用。但数组名并不是一个真正的指针变量,因为在编译数组的声明语句时,编译系统并不会为数组名另外分配存储空间,因此对数组名不能使用赋值语句以及+、-运算符。可以将一个指针变量指向同类型数组的首地址,这样就可以通过对该指针变量访问数组元素。,4.2,对一维数组而言,数组名和指针有许多相通的地方,归纳如下:(1)数组名a表示数组的起始地址。可以利用a+i表示的第i+1个元素的地址,即(3)在将pInt指向数组a的起始地址之后,pInt+i与a+i都表示数组a的第i+1个元素的地址,即该数组可以看成是一个一维数组a,该一维数组中有四个元素:a0,a1,a2,a3,每个元素又都是一个一维数组。,4.2,数组名a表示的是数组的起始地址,也表示该二维数组第0行的首地址,它是一个行地址,而a0表示第0行第0个元素的地址。行地址与元素地址要注意的问题是:(1)行地址加上或减去一个常数还表示行地址;元素指针加上或减去一个常数还是元素的地址。(2)行地址前加上运算符“*”表示该行第0个元素的地址,这里的符号“*”不是用来获取指针所指向的内容,它只是用来区分行地址和元素地址;而在元素指针前加运算符“*”表示该元素的值。(3)行地址的值与该行第0个元素地址的值相同。,4.2,根据以上的说明,对于二维数组a,下面的指针都是行地址:a、a+0、a+1、a+1+2,而a0、a1、a0+1、或=new;,4.2,第一种形式为所指向的数据分配大小为sizeof()个字节的连续存储空间,初始值表示为所分配的存储空间指定初始值。第二种形式为所指向的数据分配指定大小的数组空间,为整型变量或常量。对于上述两种情形,如果动态分配不成功,则new运算符返回NULL(0);如果成功分配,则new运算符返回所分配的存储空间的首地址,并将该地址赋给。,4.2,使用delete的一般格式为:delete;或delete;第一种格式为将动态分配给的内存空间归还给系统,第二种格式为将动态分配给的数组空间归还给系统。在用new运算符为某个指针变量所指向的数据动态分配存储空间之后,必须用delete运算符撤消,否则该存储空间将一直被占用,直到关闭电脑。,4.2,使用new和delete运算符要注意如下几点:(1)new运算符实际上是为指针变量指定一个确定的值,即用动态的方式指定一个地址给指针变量。(2)如果new运算符动态分配内存失败(内存中没有符合要求的空闲的连续内存单元),则返回NULL(0),此时指针为空指针。此时,要进行空指针判断处理。(3)与数组一样,动态分配存放数组的内存空间时,也不能在分配空间的同时进行初始化。,4.2,(4)可以用new运算符动态分配多维数组空间,但要注意的是,它返回的是行指针。当撤消动态分配二维数组空间时,一定要指明数组的行数,否则只能撤消第0行的内存空间,(5)用运算符new动态分配内存空间的指针必须保护起来,直到将该存储空间撤消,否则不仅会带来资源浪费,而且会引起一些意想不到的错误。,4.2,五、其他类型指针1、void指针void指针是空类型的指针,也称为无类型指针,它不指向任何类型,仅仅是一个地址。因此void指针不能进行指针运算,也不能直接取其指针所指向的数据的值。只有将void指针与其它类型的指针相关联,才能使用它。可以将其它类型的指针赋给void指针,但当将void指针赋给其它类型的指针时,必须进行强制类型转换。,4.2,2、const类型指针(1)指向常量的指针指向常量的指针是指指针所指向的数据为常量,定义这类指针的一般格式为:const*;或const*;指向常量的指针常用作函数的参数,此时,在函数体中不能改变该指针所指向的数据的值,4.2,(2)常量指针常量指针是指指针变量的值为常量,定义常量指针的一般格式为:*const;注意,在定义常量指针时一定要对其初始化。,4.2,(2)指向常量的常量指针定义指向常量的常量指针的一般格式为:const*const;或const*const;,4.2,4.3字符串,一、字符数组说明字符数组的一般格式为:存储类型char;数组元素都以ASCII码值的形式存放于内存空间。字符数组的初始化:(1)通过初始值表对字符数组进行初始化。初始值表中的元素为字符,各个字符之间用逗号隔开。(2)用一个字符串来初始化字符数组。此时,一定要注意字符串最后的结束标志。注意,不能将一个字符串直接赋给一个字符数组名,或数组中的某个元素。,字符数组的使用与其它类型的数组类似,即可以用元素的下标访问数组中的各个元素。但由于字符数组作为一个整体可以当成字符串来处理,因此在使用上就有自己的独特之处,比如可以对字符数组进行整体输入输出等等。但在进行整体输入输出时要注意:1.字符数组的整体输入并不受数组大小的限制。2.当字符数组的整体输出时,输出到0为止,4.3,字符数组的元素是按其ASCII码值存放在内存单元中的。字符型数组的元素的取值范围为-128127,而无符号字符型数组元素的取值范围为0255。由于这一特性,可以对字符数组中的元素进行一些类似于整数的运算。,4.3,二、字符指针表示字符串的指针我们又称为字符指针,在很多的情况下都是用字符指针来表示字符串。可以象字符数组那样直接用字符串来初始化字符指针。由于字符串的特殊性,字符指针与一般指针在使用上还是存在一定的差异。我们要充分了解这些差异。,4.3,字符指针与一般指针的差异主要表现在:(1)字符指针可以进行如下形式的赋值:pCh1=NanJing!;而一般指针能够进行下述形式的赋值:*pInt=2;(2)如果插入操作符的左操作数为字符指针,则将输出整个字符串;如果为*pCh1,则只能输出一个字符。如果插入操作符的左操作数为一般指针,则输出该指针的值,为一个地址。,4.3,可以将一个数组名赋给一个字符指针变量,表示将该字符指针变量指向字符数组的首地址,但反过来是不可以的,即不能将一个字符指针变量赋给一个字符数组名。可以将一个指针变量的值赋给另一个指针变量,这种赋值的结果是pCh1和pCh指向同一个存储单元,当其中一个指针变量所指向的数据的值改变时,另一个变量所指向的数据也跟着改变。在对字符指针进行操作时,要注意字符串的结束标志”0”。,4.3,4.4结构体,数组中的每一个元素属于同一种数据类型,利用数组处理大量的同类型数据是很方便的。但是在实际应用中,常常需要把不同类型而关系又非常密切的数据组织在一起,形成一个整体,以便于统一管理。一种称为结构体的数据类型,可以用来描述这种类型的数据集。,定义结构体类型的一般格式为:struct;其中,花括号内是结构体的内容,由若干个变量构成,这些变量的类型可以不同,它们称为结构体的成员或分量,分量名与结构体名不能相同。,在结构体的最后一定要有一个分号。,4.4,由于定义结构类型只是定义了一种数据类型,因此,当编译器编译结构体的定义时,并不为结构体中的成员分配任何内存空间,从而在定义结构体的成员时,不能指定成员的存储类型为auto、register、extern,但可以指定结构体成员的存储类型为static,其特点和作用将在以后介绍。,4.4,在定义一个结构体之后,就增加了一种新的数据类型。可以创建该类型的变量。可以用如下三种方法定义结构体变量:(1)先定义结构体类型,然后利用结构名定义结构体变量。一般格式为:存储类型,;或存储类型struct,4.4,与基本数据类型类似,在定义结构体类型的变量时,也可对该变量进行初始化,其方法与对数组的初始化方法类似,即采用用花括号括起来的初始值表。注意,初始值表中的数据类型必须与结构体中对应元素的类型一致(兼容的除外),否则会产生编译错误。另外,初始值表中的数据的个数不能大于结构体中元素的个数。在定义结构体类型的变量时,也可以指定变量的存储类型。,4.4,(2)在定义结构体类型的同时定义结构体变量。(3)在定义结构体时,省略结构名,而直接定义变量。对于结构体类型的变量,在编译过程中,编译系统将为这些变量分配相应的内存空间,所分配的空间大小原则上为结构体中所有成员所占空间的总和。结构体变量也存在作用域的问题,其作用域与一般变量的作用域相同。,4.4,对结构体变量的使用一般是通过对其成员的引用实现的。使用结构体变量的成员的一般格式为:.其中,“是结构体成员运算符,它在所有运算符中优先级最高。,4.4,结构体类型变量本身也可参与一些运算:1)同类型的结构体变量可以相互赋值。2)结构体类型变量不能直接进行输入输出。3)结构体类型变量可以作为函数的参数,函数的返回值也可以是结构体类型。,4.4,定义结构体数组的方法与定义结构体类型变量的方法类同,只是在定义时增加维数的说明,也有三种方法。在说明结构体数组时,可对它进行初始化,其方法与数组类似,有两种方法:第一种方法是将数组的每一个元素的成员的值用花括号括起来,再将数组的全部元素值用一对花括号括起来;第二种方法是在花括号内依次列出各个元素的成员值。,4.4,4.5枚举类型,定义枚举类型通常采用如下形式:enum,;一个枚举类型中可有若干个枚举常量,构成枚举量表,各枚举常量可为任意合法的标识符,它们之间用逗号隔开。枚举常量也称为枚举元素。编译系统给每个枚举元素指定一个整型常量值。如果在枚举类型定义中没有规定元素所取的整数值,系统把所列举的枚举元素的序号(从0开始)作为对应元素的值。也可以指定枚举元素的值,枚举元素可以作为整型常量使用,可以直接输出。可以用枚举类型说明枚举类型变量,而且也有与结构体类型类似的三种说明方法。在说明枚举类型变量时,也可对它进行初始化,此时可将某一个枚举元素作为它的初始值。通常将某个枚举元素赋给枚举类型的变量,但也可将相应的整数赋给枚举类型的变量,不过此时一定要进行强制类型转换。反过来,也可以将枚举变量强制转换
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- excel制表考试题及答案
- abc中考试题及答案
- 昌吉农校食堂管理制度
- 施工项目先进管理制度
- 子公司零星采购管理制度
- 央企子公司综合管理制度
- 幼儿园建设施工管理制度
- 大学学校网格化管理制度
- 公司市场化业务管理制度
- 千喜鹤餐饮营运管理制度
- 标准机柜结构设计规范模板
- 《2图形的全等》教学设计(辽宁省县级优课)-七年级数学教案
- XXXX采石场职业病危害现状评价报告
- 市政工程代建管理方案(简版)
- 住宅专项维修资金管理系统方案
- 高速公路机电工程三大系统施工方案
- 中药处方书写规范与中药处方点评
- 宫腔镜下子宫内膜息肉切除日间手术临床路径(妇科)及表单
- 桥架支吊架安装标准图-桥架支吊架图集
- GB/T 699-2015优质碳素结构钢
- GB/T 25247-2010饲料添加剂糖萜素
评论
0/150
提交评论