1 数组并非指针
extern int *x;
extern int y[];
第一条语句声明x是个int型的指针;第二条语句声明y是个int型数组,长度尚未确定(不完整的类型),其存储在别处定义。
file1:
int mango[100];
file2:
extern int *mango; // 程序无法运行
更改为 extern int mango[]; //OK,声明与定义匹配
2 声明与定义
定义是一种特殊的声明,它创建了一个对象并分配了内存;声明简单地说明了在其他地方创建的对象的名字,它允许你使用这个名字。
即 int mango[100]; 为定义;extern int mango[]; 为声明。
3 数组和指针如何访问
数组名用于确定对象在内存中的位置,也是左值,但它不能作为赋值的对象。因此,数组名是个左值但不是可修改的左值。
编译器为每个变量分配一个地址(左值)。这个地址在编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量值并将它存于寄存器中。
下图A展示数组的下标引用过程;图B展示对指针的引用过程;图C展示对指针进行下标引用的过程。