码迷,mamicode.com
首页 > 编程语言 > 详细

指针和数组的关系

时间:2019-01-17 21:54:36      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:语法   数组类   如何   没有   amp   round   总结   ack   问题   

指针与数组的天生姻缘

以指针方式来访问数组元素

(1)数组元素使用时不能整体访问,只能单个访问。访问方式有2种:数组形式和指针形式。
 
(2)数组格式访问数组元素是,数组名[下标]; (注意下标从0开始)
 
(3)指针格式访问数组元素是:*(指针+偏移量);
如果指针是数组首元素地址( a或者&a[0]), 那么偏移量就是下标:指针也可以不是首元素地址而是其他哪个元素的地址,这时候偏移星就要考虑叠加了。

(4)数组下标方式和指针方式均可以访问数组元素,两者的实质具实是一样的。在编译器内部都是用指针方式来访问数组元素的,数组下标方式只是编译器提供给编程者种壳 (语法糖)而已。所以用指针方式来访问数组才是本质的做法。
 

从内存角度理解指针访问数组的实质

(1)数组的特点就是:数组中各个元素的地址是依次相连的,而且数组还有一个很大的特点(其实也是数组的一个限制)就是数组中各个元素的类型必须相同。类型相同就决定了每个数组元占几个字节是相同的(譬如int数组每个元素都占4字节,没有例外)。

(2)数组中的元素其实就是地址相连接、占地大小相同的一串内存空间。这两个特点就决定了只要知道数组中一个元素的地址,就可以很容易推算出具他元素的地址。

 

 指针和数组类型的匹配问题

(1)int *p;  int a[5];  p=a;  //类型匹配

    int *p;  int a[5];  p=&a;  //类型不匹配。p是int*, &a是整个数组的指针,也就是一个数组指针类型,不是int指针类型,所以不匹配

(2)&a、a、&a[0] 从数值上来看是完全相等的,但是意义来看就不同了。从意义上来看,a和&a[0]是数组首元素首地址,而&a是整个数组的首地址;从类型来看,a和&a[0]是元素的指针,也就是int *类型,而&a是数组指针,是int (*) [5] ;类型。

 

总结:指针类型决定了指针如何参与运算

(1)指针参与运算时,因为指针变量本身存储的数值是表示地址的,所以运算也是地址的运算。

(2)指针参与运算的特点是,指针变量+1, 并不是真的加1,而是加1*sizeof (指针类型);如果是int *指针,则+1就实际表示地址+4,如果是char *指针,则+1就表示地址+1;如果是double*指针,则+1就表示地址+8.

(2)指针变量+1时实际不是加1而是加1*sizeof (指针类型),主要原因是希望指针+1后刚好指向下一个元素(而不希望错位)。



 

 

 

 

 

 

 
 

指针和数组的关系

标签:语法   数组类   如何   没有   amp   round   总结   ack   问题   

原文地址:https://www.cnblogs.com/sanshijvshi/p/10284658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!