指针与数组的差别还是很大的,但一般情况数组会蜕变为指针使用,下面由卓跃教育为您介绍关于C语言的extern作用于指针、数组。
以下为测试环境:gcc4.3.2-1-1、GNU/LinuxDebian5.0
1、extern与static
extern对变量、函数声明;编译时可见,即告诉编译器:“老兄,虽然这个文件里,我没有定义,但在别处定义了,你得放过我”。而出于检查和使用的需要,没有定义是不能放行的。
函数和变量都默认为extern的,在链接时所有文件可见;更甚的是默认为不加static和extern即为定义,这也就带来的extern显性声明的必然性。这将在后面详细分析。
static,字面意思是静态限定符,用于三种场合可产生三种效果:
a、作用于局部变量,在函数的生存期其值具有连续性,如何理解,通俗但不准确的表达:被初始化一次,以后每次调用该函数时继续上次的结果。
b、作用于全局变量,只在本文件作用,其相对的是extern。具体比较将在后面分析。
c、作用于函数,仅供本文件其它函数调用,函数和变量都默认为extern。具有三个作用:1.隐藏全局可见性;2.保持变量内容的持久;3.默认初始化为0。
2、extern全局变量 现代编译器都按文件编译,编译时各个文件独立检查语法错误。各个全局变量互相透明,可见域在本文件内。于是即使多个文件有多个定义也不报错,只是链接的时候所有全局变量保存在一个符号表,进行符号的定位。因此,报错也发生在链接阶段。也就是说,可见性是在链接时扩展的,编译阶段局限于本文件。 typeid;变量和函数默认是extern的,即所有文件可见。 但是默认的不仅是声明,更是定义。C语言规定,标识符可以有多个声明,但必须有且仅有一次定义。声明为了让编译器知道有哪些符号,什么类型,以便后面遇到时已经具备一定判断的意识。因此,多个文件出现了默认的typeid;就是多重定义;如果本意是多个文件共用一个符号,这时需要用到extern显性指定为声明。
externtypeid;仅仅是声明,需要另外定义,且是别的文件里的定义。
指针符号是地址的地址;
数组符号,对应整个数组;如果作为一维数组变量名,则为其第一个单元的地址。 1)数组仅仅是一个符号,作为参数时,由于形参压栈时,将数组首地址压进,即以一个空间来存放首地址,就蜕变成指针了;定义多维数组时也会被编译器解释成指针。
否则,数组名是不占单独的空间的,在符号表中是一个符号,地址为数组首地址,内容为首个单元内容。 2)定义指针时,分配一个空间(我们的体系为32位,4个字节),其内为指向的单元的地址。 通过上文,您对C语言是否有了一定的了解。如果您还有任何C语言方面的疑问,可以登录www.51great.org,点击在线咨询与在线老师交流。您也可以拨打我们的全国免费咨询专线:0591-83713060进行咨询
|