1,声明:相当于普通的声明,它所说明的并非自身,而是描述其他地方创建的对象,没有分配内存空间。
比如:int a[];声明一个整型数组。在其他地方可以创建该类型的对象,a可以被重新赋值。
2, 定义:相当于特殊的声明,它为对象分配内存空间。
比如:int a[100];定义一个整型数组,大小为100,并为其分配100个整型类型大小的字节数。
3,对于指针和数组来说,如果声明一个外部字符指针变量 extern char *p,却在别处定义为数组 char p[10],
那么在访问p[i]内容时,会将p[i]的内容即字符解释为地址,因为p被声明为一个指针,其值是地址。这是错误的。
4,当p声明为指针,只有p定义为指针时,对p所指向的内容的引用才是正确的。
5,当p定义为指针,但以数组方式引用时,其本质是数组的直接访问和指针的间接访问的组合。
例1 char*p="abcdefg";p[3];
p[3]以数组方式引用,其运行步骤如下:
(1):编译器会告知变量符号p的地址,
(2):从p的地址(左值)中得到指针,即p的值(右值)。
(3):将p的值加上偏移量3,得到一个地址,这个地址是指向p[3]内容的地址。
(4):从该地址中取得字符d。
6,当定义为数组,以数组方式引用时,
例2 char p[]="abcdefg";p[3]
p[3] 以数组方式引用时,其运行步骤如下:
(1):编译器会给变量p分配一个地址。
(2):将该地址加上偏移量3,得到新的地址。
(3):从该新的地址中取得内容,即字符d。