一、对于一维数组 :int a[5];
a就是数组名:
a做左值时表示整个数组的所有空间(10×4=40字节)因为C语言规定数组操作时只能独立单个操作其中的元素,不能整体操作数组,所以a不能做左值;a做右值时等同于&a[0],表示数组首元素的首地址;
(首元素就是数组的第0个元素,也就是a[0])
(首地址就是起始地址,就是4个字节中最开始第一个字节的地址)
a[k]表示数组的首元素:
也就是数组的第k个元素。做左值时表示数组第k个元素对应的内存空间(相当于一个变量名,可以对其赋值);做右值时表示数组第k个元素的值(也就是数组第k个元素对应的内存空间中存储的那个数)
&a就表示对数组名a取地址:
字面意思来看就应该是数组的地址。&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。);&a做右值时表示整个数组的首地址。
&a[0]表示数组第0个元素的首地址:
先搞清楚[]和&的优先级:[ ]的优先级要高于&,所以a先和[ ]结合再取地址。做左值时表示数组首元素对应的内存空间,做右值时表示数组首元素的值(也就是数组首元素对应的内存空间中存储的那个数值)。做右值时&a[0]等同于a。
总结:
1:&a和a做右值时的区别:&a是整个数组的首地址,而a是数组首元素的首地址。
这两个在数字上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。
2:a和&a[0]做右值时意义和数值完全相同,完全可以互相替代。
3:&a是常量,不能做左值。
4:a做左值代表整个数组所有空间,所以a不能做左值。