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

指针与数组的关系

时间:2015-04-08 06:41:46      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

指针与数组间关系紧密却一直没弄明晰,今天就来整理一下。

 

①定义中的内涵

当我们在定义数组时,必须要同时指定其类型和大小;而对于指针,则只需要指定其类型。

之所以数组需要指定大小,是因为系统会根据你所指定的大小为数组分配空间,例如int a[5],则数组得到sizeof(int)*5大小的存储空间(而且是连续的空间),不多不少。

而对于指针,系统只会为其分配空间,其指向地址并未分配,例如char *a,系统会为变量a分配空间,但*a(即a指向的地方)是随机的,系统不会为*a分配空间。这时候,你可以访问a或给a赋值,但却不可以访问*a或给*a赋值,因为要想使用*a,需要先使其指向有效区域,这可以通过动态申请内存或赋值(知道的有效地点)来实现。

对于指针,其自身变量和其所指向的地址皆可读写,但于数组而言,数组名就不能写,只能读了,因为指针自身变量分配有空间,而数组名没有。

 

②联系——数组名的种种

数组名就像是一个记录地址的标签,当

1 #include<stdio.h>
2 int main()
3 {
4     int a[5]={1,2,3,4,5};
5     int *b;
6     b=a;
7     printf("a[1]=%d\nb[1]=%d\n*(a+1)=%d\n*(b+1)=%d\n",a[1],b[1],*(a+1),*(b+1));
8     return 0;
9 } 

结果如下图:

技术分享

不难看出a[1],b[1],*(a+1),*(b+1)四种表达方式都指向数组中第二个元素。

 

*在参考的博文中还看到这句话:“更悬一点:因为其在这儿所起的作用仅仅是个标签而已(编译的时候就是让两者相加),所以: 1[a],1[b],也是允许的。”即:

 

1 #include<stdio.h>
2 int main()
3 {
4     int a[5]={1,2,3,4,5};
5     int *b;
6     b=a;
7     printf("a[1]=%d\nb[1]=%d\n*(a+1)=%d\n*(b+1)=%d\n",1[a],1[b],*(a+1),*(b+1));
8 } 

 

运行结果同上不变。即在编译时,只是计算(a+1)或(b+1)。

 

【待续……】

 

指针与数组的关系

标签:

原文地址:http://www.cnblogs.com/suzyc/p/4401266.html

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