



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指针和数组有着密切的关系,任何能由数组下标完成的操作也都可用指针来实现,但程序中使用指针可使代码更紧凑、更灵活。一、指向数组元素的指针我们定义一个整型数组和一个指向整型的指针变量:int a10, *p; 和前面介绍过的方法相同,可以使整型指针p指向数组中任何一个元素,假定给出赋值运算p=&a0; 此时,p指向数组中的第0号元素,即a0,指针变量p中包含了数组元素a0的地址,由于数组元素在内存中是连续存放的,因此,我们就可以通过指针变量p及其有关运算间接访问数组中的任何一个元素。 Turbo C中,数组名是数组的第0号元素的地址,因此下面两个语句是等价的p=&a0; p=a; 根据地址运算规则,a+1为a1的地址,a+i就为ai的地址。下面我们用指针给出数组元素的地址和内容的几种表示形式:(1). p+i和a+i均表示ai的地址, 或者讲,它们均指向数组第i号元素, 即指向ai。 (2). *(p+i)和*(a+i)都表示p+i和a+i所指对象的内容,即为ai。 (3). 指向数组元素的指针, 也可以表示成数组的形式,也就是说,它允许指针变量带下标, 如pi与*(p+i)等价。假若: p=a+5; 则p2就相当于*(p+2), 由于p指向a5, 所以p2就相当于a7。而p-3就相当于*(p-3), 它表示a2。二、指向二维数组的指针 1.二维数组元素的地址 为了说明问题, 我们定义以下二维数组:int a34=0,1,2,3, 4,5,6,7, 8,9,10,11; a为二维数组名,此数组有3行4列, 共12个元素。但也可这样来理解,数组a由三个元素组成:a0,a1,a2。而每个元素又是一个一维数组, 且都含有4个元素(相当于4列),例如,a0所代表的一维数组所包含的 4 个元素为a00, a01, a02, a03。如图所示: _ _a-| a0 | _ | 0 | 1 | 2 | 3 |_| |_|_|_|_| a1 | _ | 4 | 5 | 6 | 7 |_| |_|_|_|_| a2 | _ | 8 | 9 | 10| 11|_| |_|_|_|_|但从二维数组的角度来看,a代表二维数组的首地址,当然也可看成是二维数组第0行的首地址。a+1就代表第1行的首地址,a+2就代表第2行的首地址。如果此二维数组的首地址为1000,由于第0行有4个整型元素,所以a+1为1008,a+2也就为1016。如图所示_(1000) _ | 0 | 1 | 2 | 3 |_|_|_|_|(1008) _ | 4 | 5 | 6 | 7 |_|_|_|_|(1016) _ | 8 | 9 | 10| 11|_|_|_|_|既然我们把a0,a1,a2看成是一维数组名,可以认为它们分别代表它们所对应的数组的首地址,也就是讲,a0代表第 0 行中第 0 列元素的地址,即&a00, a1是第1行中第0列元素的地址,即&a10,根据地址运算规则,a0+1即代表第0行第1列元素的地址,即&a01,一般而言,ai+j即代表第i行第j列元素的地址, 即&aij。另外,在二维数组中,我们还可用指针的形式来表示各元素的地址。如前所述,a0与*(a+0)等价,a1与*(a+1)等价,因此ai+j就与*(a+i)+j等价,它表示数组元素aij的地址。因此,二维数组元素aij可表示成*(ai+j)或*(*(a+i)+j),它们都与aij等价,或者还可写成(*(a+i)j。 另外, 要补充说明一下, 果你编写一个程序输出打印a和*a,你可发现它们的值是相同的,这是为什么呢? 我们可这样来理解: 首先,为了说明问题,我们把二维数组人为地看成由三个数组元素a0,a1,a2组成,将a0,a1,a2看成是数组名它们又分别是由4个元素组成的一维数组。因此,a表示数组第0行的地址, 而*a即为a0, 它是数组名, 当然还是地址,它就是数组第0 行第0 列元素的地址。2.指向一个由n个元素所组成的数组指针在Turbo C中, 可定义如下的指针变量: int (*p)3; 指针p为指向一个由3个元素所组成的整型数组指针。在定义中,圆括号是不能少的, 否则它是指针数组, 这将在后面介绍。这种数组的指针不同于前面介绍的整型指针,当整型指针指向一个整型数组的元素时,进行指针(地址)加1运算,表示指向数组的下一个元素,此时地址值增加了2(因为放大因子为2),而如上所定义的指向一个由3个元素组成的数组指针,进行地址加1运算时,其地址值增加了6(放大因子为2x3=6), 这种数组指针在Turbo C中用得较少,但在处理二维数组时, 还是很方便的。例如: int a34, (*p)4; p=a; 开始时p指向二维数组第0行,当进行p+1运算时,根据地址运算规则,此时放大因子为4x2=8,所以此时正好指向二维数组的第1行。和二维数组元素地址计算的规则一样,*p+1指向a01,*(p+i)+j则指向数组元素aij。 例:int a34= 1,3,5,7, 9,11,13,15, 17,19,21,23; main() int i,(*b)4; b=a+1; /* b指向二维数组的第1行, 此时*b0是a10 */ for(i=1;i=4;b=b0+2,i+) /* 修改b的指向, 每次增加2 */ printf(%dt,*b0); printf(n); for(i=0; i3; i+) b=a+i; /* 修改b的指向,每次跳过二维数组的一行 */ printf(%dt,*(bi+1); printf (n); 程序运行结果如下: 9 13 17 21 3 11 19 三、字符指针 我们已经知道,字符串常量是由双引号括起来的字符序列,例如: a string 就是一个字符串常量,该字符串中因为字符a后面还有一个空格字符,所以它由8个字符序列组成。在程序中如出现字符串常量C编译程序就给字符串常量按排一存贮区域,这个区域是静态的,在整个程序运行的过程中始终占用, 平时所讲的字符串常量的长度是指该字符串的字符个数, 但在按排存贮区域时, C 编译程序还自动给该字符串序列的末尾加上一个空字符0,用来标志字符串的结束,因此一个字符串常量所占的存贮区域的字节数总比它的字符个数多一个字节。Turbo C中操作一个字符串常量的方法有: (1).把字符串常量存放在一个字符数组之中, 例如:char s=a string; 数组s共有9个元素所组成,其中s8中的内容是0。实际上,在字符数组定义的过程中,编译程序直接把字符串复写到数组中,即对数组s初始化。(2).用字符指针指向字符串,然后通过字符指针来访问字符串存贮区域。当字符串常量在表达式中出现时, 根据数组的类型转换规则,它被转换成字符指针。因此,若我们定义了一字符指针cp: char *cp; 于是可用: cp=a string; 使cp指向字符串常量中的第0号字符a, 如图所示。 _CP - | a | | s | t | r | i | n | g | 0| |_|_|_|_|_|_|_|_|_| 以后我们可通过cp来访问这一存贮区域, 如*cp或cp0就是字符a,而cpi或*(cp+i)就相当于字符串的第i号字符,但企图通过指针来修改字符串常量的行为是没有意义的。 四、指针数组 因为指针是变量,因此可设想用指向同一数据类型的指针来构成一个数组, 这就是指针数组。数组中的每个元素都是指针变量,根据数组的定义,指针数组中每个元素都为指向同一数据类型的指针。指针数组的定义格式为: 类型标识 *数组名整型常量表达式; 例如: int *a10; 定义了一个指针数组,数组中的每个元素都是指向整型量的指针,该数组由10个元素组成,即a0,a1,a2, ., a9,它们均为指针变量。a为该指针数组名,和数组一样,a是常量,不能对它进行增量运算。a为指针数组元素a0的地址,a+i为ai的地址,*a就是a0,*(a+i)就是ai。为什么要定义和使用指针数组呢?主要是由于指针数组对处理字符串提供了更大的方便和灵活,使用二维数组对处理长度不等的正文效率低,而指针数组由于其中每个元素都为指针变量,因此通过地址运算来操作正文行是十分方便的。指针数组和一般数组一样,允许指针数组在定义时初始化,但由于指针数组的每个元素是指针变量,它只能存放地址,所以对指向字符串的指针数组在说明赋初值时,是把存放字符串的首地址赋给指针数组的对应元素, 例如下面是一个书写函数month_name(n),函数返回一个指向包含第n月名字的字符指针(关于函数指针和指针函数,下一节将专门介绍)。 例: 打印1月至12月的月名: char *month_name(int n) static char *name= Illegal month, January, February, March, April, May,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目监控招投标文件编写指南
- 社交媒体招聘效果评估创新创业项目商业计划书
- 机械健康管理与维护坊创新创业项目商业计划书
- 美容护肤创业孵化平台行业跨境出海项目商业计划书
- 初中物理动能实验设计与数据分析
- 软件项目开发管理流程制定
- 剑桥少儿英语考级试卷KB1全真解析
- 电焊工技能提升培训教材
- 房地产项目销售策略及客户维护技巧
- 电气信号行业剖析-市场动态、法规影响与策略建议
- 火龙罐技术课件
- 酒店五星级服务标准培训教材
- (完整版)韦氏儿童智力测试试题
- 四年级语文上册第六单元【集体备课】课件
- 机械制图-点线面教学课件
- 第三单元 一共有多少第1课时 说课稿-2022-2023学年数学一年级上册-北师大版
- 安全仪表报警联锁回路调试记录
- 物业管理标准化管理体系员工离职、内部调职管理标准作业规程
- 全液压转向器应用基础知识26新
- 大班数学《来自毕业餐会》活动反思
- 昆明城市空间形态
评论
0/150
提交评论