ar *a时,编译器理所当然的认为 a是一个指针变量,在 32位系统下,占 4个byte。这 4个byte里保存了一个地址,这个地址上存的是字符类型数据。虽然在文件 1中,编译器知道a 是一个数组,但是在文件 2中,编译器并不知道这点。大多数编译器是按文件分别编译的,编译器只按照本文件中声明的类型来处理。所以,虽然a实际大小为 100个byte,但是在文件 2中,编译器认为a 只占4个byte。
我们说过,编译器会把存在指针变量中的任何数据当作地址来处理。所以,如果需要
访问这些字符类型数据,我们必须先从指针变量 a中取出其保存的地址。如下图:
显然,按照上面的分析,我们把文件 1中定义的数组在文件2 中声明为指针会发生错误。同样的,如果在文件 1中定义为指针,而在文件中声明为数组也会发生错误:
文件 1
char *p = “abcdefg”;
文件 2
extern char p[];
在文件 1 中,编译器分配4个byte空间,并命名为 p。同时p里保存了字符串常量“abcdefg”的首字符的首地址。这个字符串常量本身保存在内存的静态区,其内容不可更改。在文件 2中,编译器认为 p是一个数组,其大小为 4 个byte,数组内保存的是 char类型的数据。在文件 2中使用p 的过程如下图:
3. 数组参数与指针参数
无法向函数传递一个数组,C语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。