extern指针和数组的用法

来源:互联网 发布:外贸海关数据有用吗 编辑:程序博客网 时间:2024/04/30 01:07

对extern我们先来一段直白的告白
extern是计算机语言中的一个函数,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。(来自百度百科)
假设在a.cpp中定义了数组
char ar[] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’};
在b.cpp这样申明
extern char *ar; 这样会有什么问题?
你可以尝试去运行这样一组代码

void main(){    printf("%d\n",ar);    printf("%c\n",ar);    printf("%c\n",ar[0]);   }

你可以选择调试,或者去看汇编代码,但是问题的本质,也许不是那么简单的,因为我们选择任何调试的时候都是经过编译完成之后所看到的,而这个错误恰恰需要我们去提前认识到在编译的时候做了一个怎么样的处理。
在学习的时候也许有过这样的解释,指针和数组是不同的,只是有时候可以通用而已。
在extern这个关键字的申明下,ar作为一个指针变量,存储的是一个地址,此地址占用固定的4字节大小,而我们所看到的数组,数组名是不占存储空间的,也就是 &数组名,和数组名是同一个地址,代表的是数组首元素的地址。这里作为指针变量的时候指针所存储的是四字节dbca的阿斯克码值,作为地址,即0x64636261。
所以第一个printf的输出是十进制的1684234849;第二个printf是取一个字节61,阿斯克码为a;第三个printf是对0x64636261寻找地址,程序会崩溃,因为可能访问了一个非法内存。

那么下面的题目你也应该可以理解了吧
c.cpp中定义:
int arr[]={1,2,3,4,5,6,7,8,9};
main.cpp中申明:
extern int *arr;

关键代码是:

void main(){    printf("%d\n",arr);    printf("%d\n",arr+1);    printf("%d\n",arr[0]);}

此题的关键问题是,数组中所有元素都为int类型,所以他们成为地址的是低4字节,即本题中的0x00000001
这里写图片描述
其他的分析这里不做赘述。

原创粉丝点击