黑马程序员C语言教程:技术文档.docx

黑马程序员C语言教程:技术文档.docx

ID:57616113

大小:41.29 KB

页数:3页

时间:2020-08-29

黑马程序员C语言教程:技术文档.docx_第1页
黑马程序员C语言教程:技术文档.docx_第2页
黑马程序员C语言教程:技术文档.docx_第3页
资源描述:

《黑马程序员C语言教程:技术文档.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、指针数组和数组指针详解指针数组和数组指针1.定义int*p[4];//定义了一个指针数组p,p一共有4个单元,每个单元都是一个int型的指针int(*p)[4];//定义了一个数组指针p,p可以指向一个拥有4个单元的int型数组2.指针数组的用法#include intmain(){int*p[4];inta=1,b=2,c=3,d=4;p[0]=&a;p[1]=&b;p[2]=&c;p[3]=&d;printf("%d%d%d%d",*p[0],*p[1],*p[2],*(p[3]));return0;}程序输出:1234分析:指针数组的用法比较简

2、单,注意一点*p[0]和*(p[0])是一样的,因为在C语言中[]的优先级要高于*运算符。3.数组指针的用法数组指针的用法比较复杂,理解相对来说也比较困难,还是需要结合一些实际的例子来一步步的理解。例子1:intmain(){inta[8]={1,2,3,4,5,6,7,8};int*p=a;printf("%d",p[2]);return0;}程序输出结果:3分析1:这是平时在写程序时经常用到的一种写法,但是却隐藏着一些知识点可能平时都没有太注意到。这里p是一个int型的指针,然而在程序中却将p类似于数组来使用,这个怎么理解呢?其实这样写的话,就相

3、当于将p作为基址[2]表示的是相对于基址的偏移,这里是偏移两个p指向类型的单元,也就是得到的a的第三个单元(单元从1开始计数)的值也就是3。同时记住:a的理解有两种:第一种a表示这8个int单元的总称,体现在&a的时候,这个时候&a的类型为int(*)[8];第二种理解a的值代表的是一个int类型的指针,体现在a[1]=*(a+1)这种操作中。例子2#include intmain(){inta[8]={1,2,3,4,5,6,7,8};int(*p)[8]=&a;printf("%p%p",p,a);//这里是用的a的值,所以a体现的是指针的性质pri

4、ntf("%d",((*p)[3]));printf("%d",*p[3]);return0;}程序输出:0012FF600012FF6041245120分析2:可以看到p和a的值输出是一样的,但是要记住这里的p和a的类型可是完全不一样的,所以在赋值的时候没有直接将a赋值给p而是用了&a。这里的a是一个int类型的指针,而p是一个int(*)[8]类型的指针,两者直接赋值编译器会报错。第3个输出的数为4,也就是a[3]的值,但是第四个输出的数明显是一个错误的数据,同时记住不一定每次都是这个数。这个如何理解呢?p是一个数组指针,所以*p代表的才是a(尽

5、管它们值是一样的),然而由于[]的优先级高于*,所以((*p)[3])才可以取到a[3]的值。然而p[3]根据上面的理解,是以p为基址,偏移3个p指向的单元,然而p此时指向的是数组,所以p指向的是一个8个int单元的数组,所以p[3]表示的就是内存区域往后的第4个数组(每个数组拥有8个int单元)的首地址,*p[3]取到的就是第四个数组的第一个单元的值,虽然这样操作越界了,但是编译器检查不出来。例子3:一个更加复杂的例子#include intmain(){intp[3][4][5];int*q=(int*)p;int(*s)[5]=&p[1][0];i

6、nti,m;for(i=0;iq[i]=i;printf("%d",p[1][7][1]);printf("%d",(*(s+1)[3]));printf("%d",p[1][7][1]*(*(s+1)[3]));return0;}程序输出:56402240分析3:这个输出可能乍一看确实比较奇怪,但是认真分析的话还是可以得到正确结果的。首先看for循环的赋值语句,p数组一个3*4*5=60个单元,而这个for循环分别将这60个单元依次赋值为0~59。再看p[1][7][1],操作越界了这个很明显,但是来分析一下这个具体取的是哪个单元的值:1*20+7

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[2][0][0]的值,这个值就是40。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。