C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了经过考试会对指针和数组的一些考点进行突击,可是不少极其细节的东西也许并非那么清楚。本篇侧重点在于分析数组与指针的关系,何时数组能够等同于指针,何时两者不一样。编程
首先经过一张图来描述一下数组的访问过程,下图的字符数组,访问下标为9的的元素数组
须要注意的是若是其余类型的变量,那么偏移量的计算应该是 i*单变量字节数,好比char是一个字节,int是4字节,那么int类型数组计算地址是,应该是加上偏移量 i*4微信
下面是访问指针的例子:函数
符号表里有一个符号p,它的地址为4040学习
运行时,先取4040的内容,即9910。而后在取地址9910的内容,即取到指针所指向的地址的内容。spa
也就是说指针的取值,多了一个提取步骤3d
咱们经常把指针和数组混淆,好比如下这种状况,定义为指针,却使用了数组的方式来取值。指针
char *p = "pointertest";blog
c = p[i];v8
定义为指针,可是使用数组的方式来取值。咱们能够结合以上两种方式,来分析这种状况下的取值过程:
1.先根据符号p的地址,取到符号p的值,是一个地址,咱们假设为4040,也就是和上面第二种状况的指针访问同样。
2.接下来就是4040+i,获得新的地址值
3.取新的地址的内容
同理,取偏移地址的时候,须要注意变量类型,好比int类型,就是加上 i*4
如下对于两者可相互替换作一个总结
(1)extern char a[];经过extern声明的数组,不能用指针形式替换
(2)数组定义为 char a[5],不能用指针的形式替换
(3)数组做为函数参数,可使用指针形式替换
(4)在表达式中,好比c = a[i],这种状况也可使用指针形式来替换,由于在表达式中,数组名a被当作指向该数组第一个元素的指针,因此能够和指针相互替换。并且数组下标i能够和指针的偏移量等同起来,a[i]等同于 *(a+i)。
自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一块儿学习成长!
C语言C++编程学习交流圈子,【点击进入】微信公众号:C语言编程学习基地
有一些源码和资料分享,欢迎转行也学习编程的伙伴,和你们一块儿交流成长会比本身琢磨更快哦!