基础学了太久,时间一长有些东西就可能记得不太清楚,俗话说得好,"好记性不如烂笔头",所以把基础中的基础-变量的声明和定义,从C到编译原理到C++,再到Java用烂笔头记录下来
最早在编程语言中认识声明和定义是在学C语言的时候...
C语言中:如extern User user;extern int a;就是声明,变量的声明就是仅仅告诉编译器,声明的变量的存在,要预留一点空间,但并不为其分配内存.定义就是声明这个变量并真正在内存(堆或栈中)为此变量分配空间.
从编译原理上来说,声明就是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存.而定义就是不仅知道某类型的变量会被使用,并且已经为其分配了内存.
因为 在编译的时候,编译器先处理一些特殊数据(宏定义,函数的声明,变量的声明),在这个过程中,编译器 通过声明 可以预测整个定义需要的内存大小,并且 把这些大小预留起来,留给定义的时候使用(因为虽然定义,但是在 main函数里面没有调用,一样的不分配内存)。 如果不事先声明,直接定义,有可能会造成系统崩溃,出现内存不足,不能分配。 然而现在内存都是1G左右了,所以一般空间都足够,所以你也可以不声明直接定义函数。 但是一旦内存紧张,就会出错,而且程序简洁性就很低。(不看到定义,还不知道原来还定义了这么一个函数!!!)
在C++中,如short a;int b;这些是定义,也就是说在栈上分配了内存,而对于对象,比如自定义的类:User user;也就是说在栈上分配了引用或句柄,没有具体分配对象的内存,而User *puser就需要puser=new User(),才会真正为对象在堆上分配空间.
在C和C++中,extern User user就是声明,并没有分配内存空间
在Java中,如果在方法中的局部变量,如使用short a;int b;也只是声明,因为没有初始化时,要想使用这个变量时编译器要会求初始化这个变量,如果不使用这个变量,那单是声明这个变量是没有问题的,如果要使用的 话就要初始化这个变量,即是要给这个变量分配内存并赋值,也就是定义.如果在类中声明一个成员变量,如short a;int b; 在方法中要使用这两个变量时,编译器没有要求初始化这变量,因为当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后, 自动为成员变量指定初始值,所以,a 和b的值都会被初始化为0.而这个0是在堆内存中的
下面我们来看看Java中局部变量的初始化和在内存中的运行机制:局部变量声明后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化,这意味着声明局部变量后,系统并未为这个变量分配内存空间,只是在栈中分配了一个内存保存这个变量名,并没有为变量的值分配内存.直到等到程序为这个变量赋初始值时,系统才会为这个局部变量分配内存,并将初始化值保存到这块内存中.
与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中的.如果局部变量是基本类型的变量,则直接把这个变量的值保 存在该变量对应内存中;如果局部变量是一个引用类型的变量,这个变量里存放的是地址,通过该地址引用到该变量实际引用的对象或数组.因为局部变量只保存基 本类型的值或者对象的引用,所以局部变量所占的内存区通常比较小.
如果有误,请斧正!
【转】变量的声明和定义,从C到编译原理到C++,再到Java的更多相关文章
-
变量的声明和定义以及extern的用法
变量的声明和定义以及extern的用法 变量的声明不同于变量的定义,这一点往往容易让人混淆. l 变量 ...
-
JAVA学习笔记:注释、变量的声明和定义、
本文内容: 注释 变量的声明和定义 成员变量和局部变量 首发时间:2018-03-16 15:59 注释: 单行注释:// 多行注释:/* - */ 变量: 变量是内存中的一个存储区域,变量的定义就是 ...
-
C++ 变量的声明与定义的区别
变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点 ...
-
【C++】C++中变量的声明与定义的区别
声明(declaration):意味着告诉编译器关于变量名称.变量类型.变量大小.函数名称.结构名称.大小等等信息,并且在声明阶段不会给变量分配任何的内存. 定义(definition):定义就是在变 ...
-
Java变量常量声明和定义
一.常量和变量 1.常量变量定义 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 2 ...
-
C++变量的声明和定义
1.变量的定义:变量的定义用于为变量分配存储控件,还可以为变量指定初始值.在一个程序中,变量有且仅有一个定义. 2.变量的声明:用于向程序表名变量的类型和名字.程序中变量可以声明多次,但只能定义一次. ...
-
C:变量的声明与定义
声明变量不需要建立存储空间,如:extern int a; 定义变量需要建立存储空间,如:int b; #include <stdio.h> int main() { //extern 关 ...
-
C语言函数及变量的声明与定义的区别
变量: 1.声明变量不需要建立存储空间,如:extern int a; 2.定义变量需要建立存储空间,如:int a:或者 int b=10:无论变量是否赋值,只要定义它,即占用空间. 3.int a ...
-
switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
随机推荐
-
Visual Studio &ldquo;14&rdquo; CTP 4
微软发布于10月6日发布了Visual Studio "14"CTP 4,本次发布的更新主要包括:ASP.NET vNext runtime和一些工具的优化(ASP.NET vNe ...
-
java如何区分是form表单请求,还是ajax请求
requestType = request.getHeader("X-Requested-With"); if(requestType==null) ...
-
通过google的inurl:backupdata*dede_admin获取账号密码
简要描述:很简单,通过google可找出备份路径. 详细说明:http://www.google.com.hk/search?q=inurl:backupdata*dede_admin&hl= ...
-
80x86的3种工作方式
80x86中的32位CPU全面支持32位的数据.指令和寻址方式,提供了3种工作方式:是地址方式.保护方式和保护方式下的虚拟8086方式.在计算机上电或复位后,32位CPU首先初始化为是地址方式,再通过 ...
-
DataTable数据存储问题
需求: 我想要实现这样一个效果:用户可以在表中通过右键新建行.删除行(这两个后面再写),编辑数据后进行保存.这里保存需要做一个区分,就是新增的和修改的.他们的区别就是新增的主键为空,而修改的因为原本就 ...
-
if -----if else语句
if语句是用来进行判断的,其使用格式如下: 单分支 if 判断的条件: 满足条件后要执行的代码 双分支 if 条件: 满足条件执行代码 else: if条件不满足就走这段 这里必须要插入这个缩进的知识 ...
-
#Java学习之路——基础阶段二(第十篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
-
python之BeautifulSoup模块
# 名称修改(bs4) from bs4 import BeautifulSoup 帮助文档 Beautiful Soup parses a (possibly invalid) XML or HTM ...
-
Bootstrap 3之美03-独立行,文字环绕,图片自适应,隐藏元素
本篇主要包括: ■ 添加独立的一行■ 文字环绕■ 图片自适应■ 隐藏元素 添加独立的一行 在id为body的section和id为main的section之间,添加2张图片. 我们发现,新加的 ...
-
iOS开发之如何应对苹果app的ipv6时代?
WWDC2015苹果宣布在ios9支持纯IPv6的网络服务,并且要求2016年提交到app store的应用必须兼容纯IPv6的网络,要求适配的系统版本是ios9以上(包括ios9). 一 背景介绍 ...