C语言中a和&a
C语言中a和&a
一.a
这里我们先看看数组名代表的是什么,这个概念可能大家有所误解,认为数组名代表的就是数组的地址,当然,数组名代表的是一个地址,但是关键是,通过这个地址,我们关注的是它能取得多大空间的数据的值。例如对于一个char 类型的地址,我们能够取得一个字节的值,对于一个int型的地址,我们能够取得4个字节的值。好了,下面我来谈谈类型的理解。
1.C语言中的类型
char a ; =====> a是char类型
short b; =====> b 是short类型
int c; =====> c是int类型
char *p; =====> p是char *类型
Short *p; =====>p是short *类型
Int *c ======> c是 int *类型
因此,我们可以得出一个结论:把变量名去掉,剩下的就是类型。
因此,我们的数组就可以说是一个特殊的类型。以int类型的数组为例,来说说我们
的a和&a.
例如:int a[4];
众所周知,a是一个地址。其实,a的本来的面目应该是a + 0,只不过,这个0我们常常
省略了,*(a + 0)表示什么?,这个就是代表我们取得第一个元素的数据,也就是a[0].
因此,我们可以理解为a代表了首元素的地址。也就是a[0]的地址。因此,我们得出了一个
结论:数组的数组名,代表了数组首元素的首地址。
int a[4]数组中,a[0]的数据类型为int 类型,它的地址就应该用int *来保存。
故a的类型应该用int *类型来保存。
2.&a地址详解
理解了a,我们再来理解&a的话,相对来说就比较容易了。刚刚说了,我们变量名去掉,剩下的就是我们的类型。还是以int 类型的数组为例子来讲解。
例如:
char a; ====>&a表示的是我们的地址。&a +1一次移动一个char类型的
大小
short a; ====>&a表示的是我们的地址。&a +1一次移动一个short类型
的大小
int a; ===>&a表示的是我们的地址。&a +1一次移动一个int类型的
大小
同理:int a[4] ===>数组的类型为int [4];&a表示的就是我们int [4]的,整个变量的地址。把
Int [4]看成一个整体,&a + 1一次移动懂得大小为整个数组的大小,也就是20个字
节。&a可以理解成数组真正的地址。
通过上面的分析,&a就好理解了,他就是变量a的地址,这个变量a的作用范围是四个int空间的数据,也就是如果将&a赋给某个变量p,p的类型应该是:int (*)[4];也就是指向包含4个int数据的数组的指针,这个叫做数组指针。
再来看看a+1和&a+1的区别,a+1表示的是数组第一个元素地址,&a+1表示的是跨过a数组的下一个地址。如下图