这里我们先看看数组名代表的是什么,这个概念可能大家有所误解,
认为数组名代表的就是数组的地址,当然,数组名代表的是一个地址,但是关键是,通过这个地址,我们关注的
是它能取得多大空间的数据的值,例如对于一个char 类型的地址,我们能够取得一个字节的值,对于一个
int型的地址,我们能够取得4个字节的值。
这里我们以整形数组为讲解:
int a[4];
a是一个地址,
我们知道a其实本来的面目应该是:
a+0,
只不过这个0
我们就省了,
*(a+0)
是什么呢,
这个代表的就是取得第一个元素的内容,
也就是
a[0]
,
所以我们可以知道
a
它代
表的应该是第一个(下标为
0
)元素的地址。
这里我们先从另外一个方面来理解什么是数组,其实我们可以把数组假设为一个基本类
型变量,
它的类型为
int [4].
也就是变量
a
这个对象代表的就是
4
个
int
那么大小的一个区间,
而且不可分割。
它和一般变量不同的地方在于,
它的操作受限,
不能像一般变量那样,
直接
通过赋值符号一次性将整个区间的值赋值给另外一个相同的数组变量。
而只能通过下标来一
个个元素的赋值。
通过上面的分析,
&a
就好理解了,他就是变量
a
的地址,这个变量
a
的作用范围是四个
int
空间的数据,也就是如果将
&a
赋给某个变量
p
,
p
的类型应该是:
int (*)[4];
也就是指向
包含
4
个
int
数据的数组的指针。
再来看看
a+1
和
&a+1
的区别,
a+1
表示的是数组第一个元素地址,
&a+1
表示的是跨过
a
数组的下一个地址。通过图来表示可能更加清晰可理解:
其实
&a
和
a
的值倒是完全一样的,都是下标为
0
的元素的地址,关键在于它们的作用域
不同,在网上看到一个比喻觉得挺恰当的,长沙在长沙市来说是中心,同时在湖南省来说,
也是湖南省的政治中心,
长沙即作为市的中心,
也作为省的中心,但是在不同的范围内,
表
达的意思是不一样的。