标签:
指针与数组间关系紧密却一直没弄明晰,今天就来整理一下。
①定义中的内涵
当我们在定义数组时,必须要同时指定其类型和大小;而对于指针,则只需要指定其类型。
之所以数组需要指定大小,是因为系统会根据你所指定的大小为数组分配空间,例如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