已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-精选财经经济类资料- -最新财经经济资料-感谢阅读- 1 浅析 C 语言数组与指针 摘 要:数组和指针是 C 语言的 两个最重要的概念,它们若结合起来使 用,非常灵活,初学者往往感到无所适 从,笔者根据多年的经验,利用典型实 例和图表对指向一维数组的指针的定义 和数组元素的引用、指针与自增自减运 算符相结合的一些常见表达式的具体含 义及区别、二维数组中各数组元素的多 种地址表示方式及访问二维数组时如何 定义指向数组元素的指针和指向某行数 据的指针等进行了描述和分析,所有实 例都在 VC6.0 环境下通过,希望初学者 能快速理解和掌握。 中国论文网 /8/view-12793886.htm 关键词:C 语言 指针 数组 自 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 2 增自减 中图分类号:TP31 文献标识码: A 文章编号:1672-3791(2015) 11(c)-0003-02 在 C 语言中数组表示一组数据类 型都一样的有序数据的集合,在内存中, 它们占有连续的存储单元,数组分一维 数组和多维数组,一维数组是数组中最 简单的,比较容易理解,用一个数组名 和一个下标就能唯一地确定一个元素。 多维数组理解相对抽象些,以二维数组 举例,二维数组在内存中虽然是占一个 连续的存储单元,但是习惯上把它写成 矩阵的形式,更有助于理解其逻辑结构, 二维数组每一行都可以看成一个一维数 组。任何数组它们的数组名代表数组的 首地址。而指针是 C 语言的另一个重要 概念,指针代表地址,并且指针是可以 移动的,对于数组和指针的使用,初学 者往往感到无所适从,笔者根据多年经 验,利用等级考试中的典型实例来进行 描述和分析,所有实例如都在 VC6.0 环 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 3 境下通过,希望初学者能快速理解和掌 握。 1 指向一维数组指针的定义及数 组元素的引用 定义指向数组元素的指针变量的 方法,与定义指向变量的指针变量相同, 假设定义了一个一维数组 int a5和一个 指针变量 int *p,如何让指针变量指向 数组呢?对于一维数组来说,只要让指 针变量指向它的数组元素就可以,因为 数组名 a 代表数组的首地址,所以 p=&a0 或 p=a 都表示指针指向数组的 第一个元素,直接定义可以写成 int *p=a。而 p+1 表示指向下一个元素, p- 1 表示指向数组上一个元素,这样,其 后面第 i 个元素它的地址就可以表示成 p+i,也可以表示成 a+i。 若 p 指向 a0,而 ai的地址可 以用 p+i 或 a+i 表示,所以,引用数组 元素的时候,既可以用普通的下标法如 ai形式,也可以用指针法,这时 *(p+i)和*(a+i)都可以表示 ai元素。 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 4 例 1: #include void main( ) int a6 =10,20,30,40,50,60 , *p,i=3; p=&a1; printf(“%d ,%dn”,ai,pi) ; 实例分析:此实例中,定义了一 个指针指向 a1,i 的值为 3,输出 a3 和 p3的值,很多初学者以为 pi的写 法是错误的,有的初学者则认为 a3和 p3等价,输出结果是 40,40,但实际 上,在 C 语言中,指针变量可以带下标, 程序在编译时,会把下标的处理转换为 地址的,pi 处理成*(p+i ) ,因为一开 始的时候 p 指向 a1,那么 p+i 则表示 往后数第三个元素,也就是 a4,故此 程序输 p 出结果为 40,50。若一开始 p=a,也就是说指针指向第一个元素, 那么 ai和 pi的值就是相等的。 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 5 2 指针与自增自减运算符的结合 指针若与自增自减运算符结合起 来使用,初学者最容易出错,以自增运 算符为例,若程序中出现 *p+、*(p+) 、*(+p) 、+(*p) 等算式,看起来差不多,很多初学者搞 不懂它们之间的区别,殊不知“失之毫 厘,谬以千里” ,因为不懂它们的区别, 分析程序时往往得到错误的结果。 首先,大家要知道“*”和“+”都 是单目运算符,它们同一个优先级,其 结合方向是自右向左的,所以*p+和 *(p+)等价,根据自增运算符的“ 名 前先取”原则,要先取 *p 的值,再使 p 自增 1,即指向下一个数组元素, *(+p)则是先使 p 指向下一个元素, 再取*p 的值,这几个算式都是对所指的 地址加 1。 +(*p)表示先取*p,再 在这个值的基础上加 1,也就是对所指 的元素的值加 1。 例 2: #include void main( ) -精选财经经济类资料- -最新财经经济资料-感谢阅读- 6 int a5=2,4,6,8,10 , *p,*k; p=a;k=&p; printf(“%d ”,*(p+) ) ; printf(“%d n”,*k) ; 实例分析:此实例中,自先定义 了数组 a,指针 p 和指向指针的指针 k,通过 p=a 和 k=&p 语句,使指针 p 指向数组 a 的首地址, k 指向指针 p, 接下来 printf(“%d ”,*(p+) )语句, 是先输出*p 的值为 2,再使指针往后指, 再输出*k 的指也就是*p 的值,此时, p 指向 4,输出 4,程序的输出结果为“2 4”。 3 指向二维数组指针的定义及数 组元素的引用 在使用指针指向二维数组时首先 要了解多维数组元素的地址表示方式, 假设有二维数组 a33,那么在逻辑上 可以把这个二维数组看作是一个 3 行 3 列的表格,也可以看成是一个有 3 个元 素的一维数组,该数组的每个元素也是 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 7 一个一维数组,序号为 0 的行的首地址 可以用 a0、&a0 或 a 表示,序号为 1 的行的首地址可表示为 a1、&a1或 a+1,如图 1 所示。根据一维数组指针 的定义,a0的值可以又表示成为 *a,a1可以表示为*(a+1) ,ai 即为 *(a+i ) 。序号为 0 的行的首地址也就是 元素 a00的地址,即&a00,它后 面几个元素的地址可以表示为 a0 +1,a0+2 ,若用指针法表示为 *(a+0) 、*(a+0)+1 和*(a+0)+2, 以此类推,第 i 行第 j 列元素的地址 &aij可以表示成为 ai+j,指针法表 示为*(a+i ) +j,也就是说 &aij、ai +j、*(a+i)+j 是等价的。这样,对于 一个二维数组来说,元素 aij可用指 针法表示为*(ai+j)或*(*(a+i) +j) 。 指针变量指向二维数组中 的元素,可以有两种定义指针方法,一 种是直接定义成指向数组元素的指针变 量,如 int *p,再让 p 指向数组中某个 具体元素;还有一种是定义成指向二维 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 8 数组某一行的指针变量,假设一行有 M 个数据,则可以定义成 int (*p)M =a,这样就可以让指针指向第一行。 例 3:#include void main( ) int a34 =1,3,5,7,9,11,13,15,17,1 9,21,23 ; int (*p)4=a,i,j,k=0; for(i=0;i3;i+) for(j=0;j2;j+) k=k+*(*(p+i )+j ) ; printf(“k=%dn”,k) ; 程序分析:此实例中,指针 p 指 向二维数组 a 的首地址,然后执行循环, 首先 i=0,j=0,累加*(*(p+0)+0) , 即 a00,接着 i=0,j=1,累加 *(*(p+0)+1) ,即 a01,然后 j=2 时跳出内循环,以此类推,执行下一次 外循环 i=1 时,累加 a10和 a11, 执行外循环 i=2 时累加 a20和 a2 1最后 i=3 时跳出整个循环,由此 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 9 看出,语句在这里其实就是累加二维数 组第一列和第二列的元素。最后结果为 1+3+9+11+17+19=60,输出“k=60”。 总之,指针和数组结合起来使用 非常灵活,同一地址有多种表示方法, 而指针根
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林艺术学院《影视照明技术》2021-2022学年第一学期期末试卷
- 吉林艺术学院《书法实训I》2021-2022学年第一学期期末试卷
- 吉林艺术学院《剪辑基础》2021-2022学年第一学期期末试卷
- 2024年供热管网互联互通协议书模板
- 吉林师范大学《中国东北史》2021-2022学年第一学期期末试卷
- 2024年大型绿植售卖合同范本
- 2024年大厂员工合同范本
- 娱乐场营销合同协议书范文范本
- (浙教2024版)科学七年级上册3.2 太阳系的组成与结构 课件(共2课时)
- 吉林师范大学《外国古代教育史》2021-2022学年第一学期期末试卷
- 围墙监控施工方案
- 中铁Y工程公司基层员工薪酬体系的优化研究
- 14S501-2 双层井盖图集
- 广东省湛江市廉江市第四中学2023-2024学年八年级上学期期中考试物理试题
- 建筑工程冬期施工规程JGJ/T 104-2011
- 网上评卷技术服务投标方案(技术方案)
- 音乐表演职业生涯规划书
- 江西省住宅工程开裂、渗漏等质量常见问题防治技术指南
- 工程变更申请单(ECR)
- 电梯安装危险源与危险评价表
- 医院信息化建设项目验收方案
评论
0/150
提交评论