指针与数组的定义与声明
1.定义为数组,声明为指针
文件1中定义:char a[100]; //文件1中定义了数组a
文件2中声明:extern char *a; //文件2中声明它为指针
文件2中extern告诉编译器a这个名字已经在别的文件中被定义了,下面的代码使用的名字a是别的文件定义的。
结果:把文件1中定义的数组在文件2中声明为指针会发生错误。
分析:
extern a[] 等价于extern a[100],因为这两个都是声明,不分配空间,所以编译器无需知道这个数组有多少个元素。这两个声明都告诉编译器a是在别的文件中被定义的一个数组,a同时代表着数组a的首元素的首地址,也就是这块内存的起始地址。数组内地任何元素的地址都只需要知道这个地址就可以计算出来。
但是,当你声明为extern char *a时,编译器理所当然的认为a是一个指针变量,在32位系统下,占4个byte。这4个byte里保存了一个地址,这个地址上存的是字符类型的数据。虽然在文件1中,编译器知道a是一个数组,但是在文件2中,编译器并不知道这点。大多数编译器是按文件分别编译的,编译器只按照本文件中声明的类型来处理。所以,虽然a实际大小为100个byte,但是在文件2中,编译器认为a只占4个byte。
2. 定义为指针,声明为数组
文件1 char *p = "abcdefg";
文件2 extern char p[];
结果:在文件1中定义为指针,而在文件2中声明为数组会发生错误
分析:在文件1中,编译器分配4个byte空间,并命名为p。同时p里保存了字符串常量"abcdefg"的首字符的首地址。这个字符串常量本身保存在内存的静态区,其内容不可更改。在文件2中,编译器认为p是一个数组,其大小 为4个byte,数组内保存的是char类型的数据。
总结:你的代码在一个地方定义为指针,在别的地方也只能声明为指针;在一个地方定义为数组,在别的地方也只能声明为数组。
浙公网安备 33010602011771号