指针与数组的定义与声明

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类型的数据。

总结:你的代码在一个地方定义为指针,在别的地方也只能声明为指针;在一个地方定义为数组,在别的地方也只能声明为数组。

posted @ 2012-08-15 17:59  blankqdb  阅读(3169)  评论(0)    收藏  举报