- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
指针数组和数组指针详解指针数组和数组指针1.定义int *p[4]; //定义了一个指针数组p,p一共有4个单元,每个单元都是一个int型的指针int (*p)[4]; //定义了一个数组指针p,p可以指向一个拥有4个单元的int型数组2.指针数组的用法#include?int main(){int *p[4];int a=1, b=2, c=3, d=4;p[0] = a;p[1] = b;p[2] = c;p[3] = d;printf(%d %d %d %d\n, *p[0], *p[1], *p[2], *(p[3]));return 0;}程序输出:1 2 3 4分析:指针数组的用法比较简单,注意一点*p[0]和*(p[0])是一样的,因为在C语言中[]的优先级要高于*运算符。3.数组指针的用法数组指针的用法比较复杂,理解相对来说也比较困难,还是需要结合一些实际的例子来一步步的理解。例子1:int main(){int a[8] = {1, 2, 3, 4, 5, 6, 7, 8};int *p = a;printf(%d\n, p[2]);return 0;}程序输出结果:3分析1:这是平时在写程序时经常用到的一种写法,但是却隐藏着一些知识点可能平时都没有太注意到。这里p是一个int型的指针,然而在程序中却将p类似于数组来使用,这个怎么理解呢?其实这样写的话,就相当于将p作为基址[2]表示的是相对于基址的偏移,这里是偏移两个p指向类型的单元,也就是得到的a的第三个单元(单元从1开始计数)的值也就是3。同时记住:a的理解有两种:第一种a表示这8个int单元的总称,体现在a的时候,这个时候a的类型为int (*)[8];第二种理解a的值代表的是一个int类型的指针,体现在a[1]=*(a+1)这种操作中。例子2#include?int main(){int a[8] = {1, 2, 3, 4, 5, 6, 7, 8};int (*p)[8] = a;printf(%p %p , p, a); //这里是用的a的值,所以a体现的是指针的性质printf(%d , ((*p)[3]));printf(%d\n, *p[3]);return 0;}程序输出:0012FF60 0012FF60 4 1245120分析2:可以看到p和a的值输出是一样的,但是要记住这里的p和a的类型可是完全不一样的,所以在赋值的时候没有直接将a赋值给p而是用了a。这里的a是一个int类型的指针,而p是一个int (*)[8]类型的指针,两者直接赋值编译器会报错。第3个输出的数为4,也就是a[3]的值,但是第四个输出的数明显是一个错误的数据,同时记住不一定每次都是这个数。这个如何理解呢?p是一个数组指针,所以*p代表的才是a(尽管它们值是一样的),然而由于[]的优先级高于*,所以((*p)[3])才可以取到a[3]的值。然而p[3]根据上面的理解,是以p为基址,偏移3个p指向的单元,然而p此时指向的是数组,所以p指向的是一个8个int单元的数组,所以p[3]表示的就是内存区域往后的第4个数组(每个数组拥有8个int单元)的首地址,*p[3]取到的就是第四个数组的第一个单元的值,虽然这样操作越界了,但是编译器检查不出来。例子3:一个更加复杂的例子#include?int main(){int p[3][4][5];int *q = (int *)p;int (*s)[5] = p[1][0];int i,m;for(i = 0; i q[i] = i;printf(%d ,p[1][7][1]);printf(%d ,(*(s+1)[3]));printf(%d\n,p[1][7][1]*(*(s+1)[3]));return 0;}程序输出:56 40 2240分析3:这个输出可能乍一看确实比较奇怪,但是认真分析的话还是可以得到正确结果的。首先看for循环的赋值语句,p数组一个3*4*5=60个单元,而这个for循环分别将这60个单元依次赋值为0~59。再看p[1][7][1],操作越界了这个很明显,但是来分析一下这个具体取的是哪个单元的值:1*20+7*5+1=56,也就是说相当于取的是q[56]的值,这个值就是56。比较难理解的就是(*(s+1)[3]),不过根据前面的讲解,理解这个也是不难的,s是一个int (*)[5]类型的指针,所以s+1就会指向下一个数组(每个数组包含5个int单元),s+1的值也就相当于是p[1][1]了,然而[]运算相当于将前面的作为基址进行偏移,偏移3个单元(每个单元又是一个数组),所以就相当于p[1][4],然而由于p的第二维只有最多3的下标,所以更为准确的说法就是p[2][0],然后取这个地址的值,也就是取p
您可能关注的文档
- 丝网印刷SOP剖析.ppt
- 趋势科技整体解决方案(副本).ppt
- 第五章 井下电工复训机考(带答案).ppt
- 什么是有哪些信誉好的足球投注网站引擎优化概论.docx
- 浅谈城市一卡通主要厂商.docx
- 第九章 淘宝站内推广方案.doc
- 单晶硅棒、单晶硅片加工工艺要领.docx
- 第十章 2017上半年软考初级程序员考试大纲.docx
- 你的照片扫描时怎样设定分辨率.doc
- 小学语文说课基本框架讲述.doc
- 2025年中国光网络行业市场运营现状及投资规划研究建议报告.docx
- 2024-2030年中国二手3C电商行业发展监测及投资潜力预测报告.docx
- 中国园林建筑行业市场调研及未来发展趋势预测报告.docx
- 2025年中国聚光灯市场运营态势分析及投资前景预测报告.docx
- 安全教育:让艺术设计更安全-艺术设计工作室安全.pptx
- 中国福建省水泥行业市场调查研究及发展战略规划报告.docx
- 中国单反数码相机市场竞争态势及投资规划建议报告.docx
- 2025年中国奶瓶消毒烘干器市场调查研究及行业投资潜力预测报告.docx
- 中国数字电视机顶盒芯片行业发展监测及投资策略研究报告.docx
- 人造纤维(纤维素纤维)项目安全风险评价报告.docx
最近下载
- 江西农业大学2021-2022学年第1学期《高等数学(上)》期末考试试卷(B卷)及标准答案.pdf
- 施工组织设计-江城水泥混凝土土.doc VIP
- 山西农业大学2021-2022学年第1学期《高等数学(上)》期末考试试卷(A卷)及标准答案.pdf
- 八年级上语文 《红星照耀中国》纪实作品人教PPT课件优质课比赛公开课获奖.ppt
- B2C电子商务信任实证研究的现状与思考.doc
- 有理数乘方练习题.doc VIP
- 经典电动力学-北京大学物理学院.PDF
- 幂的乘方与积的乘方-练习题(含答案) .doc VIP
- 政府采购非招标方式概述 .ppt VIP
- 云南南博会会展服务中心招聘笔试真题2023.docx VIP
文档评论(0)