所谓定义就是(编译器)创建一个对象,为这个对象分配一块内存,并给它取上一个名字,这个名字就是就是我们经常所说的变量名或对象名。
声明有两重含义:
(1) 告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。
(2) 告诉编译器,这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名。
定义和声明的最重要区别就是:
定义创建对象并为这个对象分配了内存,声明没有分配内存。
参考文献:
http://hi.baidu.com/kingcham/blog/item/71740f12ab31012fdc54015d.html
http://apps.hi.baidu.com/share/detail/20436534
《C语言深度解剖》 北京航空航天大学出版社 陈正冲 P2-P3
在JAVA程序中
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。
声明是向编译器介绍名字--标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。
而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。
总之就是:把建立空间的声明成为“定义”,把不需要建立存储空间的成为“声明”。
基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。
例如:类A
如果A a;就是一个声明,告诉编译器a是A类的一个对象变量,但是不进行初始化;
如果以后a=new A();这就是初始化,分配了空间。
(我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。)
用static来声明一个变量的作用有二:
(1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。
(2)外部变量用static来声明,则该变量的作用只限于本文件模块。
声明:告诉编译器变量的类型 在哪里 或者函数的特征(返回值 参数类型 个数)
定义:告诉编译器 在此处分配存储空间 建立变量和函数
同一变量定义只有一个(干嘛要多处分配空间呢 内存很宝贵的~)
但是可以声明多次
变量有点混淆--
int a; 是个声明 也是个定义
extern int a; 只是声明
所以声明包含定义,有足够的信息让编译器建立变量的声明 就是一个定义
为了让int a;不是定义(别给a分配空间) 前面加extern吧
(所以 extern int a=1;是要出错的 --BB)
函数很清楚--
声明就是没有函数体的 定义则有
事实上函数声明前本来也要加extern的 但是可以省略
程序内存简介
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。