深入学习数组

  深入学习一下数组

从内存角度来理解数组

(1)从内在角度讲,数组变量就是一次分配多个变量,而且这多个变量在内存中的存储单元是次相连接的。

(2)我们分开定义多个变量(譬如inta,b,c,d;)和一次定义一个数组(int a[4]) ;这两种定义方法相同点是都定义了4个int型变星, 而且这4个变星都是独立的单个使用的;


从编译器角度来理解数组

(1)从编译器角度来讲,数组变量也是变量,和普通变量和指针变量并没有本质不同。变量的质就是一个地址,这个地址在编译器中决定具体数值,县体数值和变量名绑定,变量类型决定个地址的延续长度。

(2)搞清楚:变量、变量名、变量类型这三个概念的具体含义,很多问题都清楚了。int a;  char a;
 

数组中几个关键符号(a  a[0]  &a  &a[0])的理解 (前提是int a[10])

(1)这4个符号搞清楚了,数组相关的很多问题都有答案了。理解这些符号的时候要和左值右值结合起来,也就是搞清楚每个符号分别做左值和右值时的不同含义。

(2)a就是数组名。a做左值时表示整个数组的所有空间(10x4=40字节) ,又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值; a做右值表示数组首元素(数组的第0个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址)。a做右值等同于&a[0];

(3)a[0]表示数组的首元素,也就是数组的第0个元素。 做左值时表示数组第0个元素对应的内存空间(连续4字节);表示数组第0个元素的值(也就是数组第0个元素对应的内仔空间中存储的那个数)

(4)&a就是数组名。取地址,字面意思来看就应该是数组的地址。&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值);&a做右值时表示整个数组的首地址

(5)&a[0]字面意思就是数组第0个元素的首地址(搞清楚[  ]和&的优先级,[  ]的优先级要高于&,所以a先和[  ]结合起来再取地址) ,做左值时表示数组首元素对应的内存空间,做右值时表示数组首元素的值(也就是数组首元素对应的内存空间中存储的那个数值)。做右值时&a[0]等同于a。

 总结:
1: &a和a做右值时的区别: &a是整个数组的首地址,而a是数组首元素的首地址。这两个在数值上是相等的,但是意义不相同,意义不相同会导致他们在参与运算的时侯有不同的表现。
2: a和&a[0]做右值时意义和数值完全相同,完全可以互相替代。
3: &a是常量,不能做左值。
4: a做左值代表整个数组所有空间,所以a不能做左值。

猜你喜欢

转载自www.cnblogs.com/sanshijvshi/p/10280012.html