2.1 定义,声明,初始化,赋值的区别
问题描述:
定义,声明,初始化和赋值都是变量的基本操作,但是这几个概念很容易让一个初学者感到迷茫。尤其是在讲到变量的时候,定义和声明更是让人极容易混淆的一对概念。在我刚学习C语言的时候,一直错误的以为形如int i;就是声明,而形如int i=3就是定义。这种看上去很合理的分类方式一直误导了我很多年。
实例分析:
在一个程序中,通常仅仅是一个变量的存在性时的操作就是声明,就好像我们向仓库管理员提出了仓位使用的申请一样,这时虽然申请了,但是仓库管理员还没有为我们分配仓位。
与之区别的是定义,定义指的是我们向仓库管理员申请,仓库管理员也分配给我们了仓位。变量的这两个操作之间的区别就在于是否分配了内存空间。(与我们是否向内存空间进行操作无关)。
int i=3这种方式一定分配了内存空间,因为内存空间已经保存了3这个整型值。但是是否int i这种方式编译器也为变量i分配了空间呢?
一个最好的办法就是看看变量i是不是有了地址,再看一下变量i在内存中是不是占了空间。下面给出一个例子:
/*example1_3_14.c*/ int _tmain(int argc, _TCHAR* argv[]) { int x; int y=3; printf("The address of x is %d,The size of x is%d\n",&x,sizeof(x)); printf("The address of y is %d,The size of y is%d\n",&y,sizeof(y)); return 0; } |
输出的结果为
The address of x is 1245024,The size of x is 4
The address of y is 1245012,The size of y is 4
可以看到x和y两个变量都被分配了内存空间,x被分配了从1245024开始的4个字节。因此这两种方式都是定义。
那么变量的声明又是什么情况呢?
变量的声明通常只会出现在一种特殊的情形中:
有时我们在一个C文件中可能会用到另一个C文件中的变量,比如
/*file1.c---------定义的文件*/ float Pi; |
/*file2.c--------引用的文件*/ |
这里面file2中的Pi就是file1里面定义过的全局变量。这时的extern Pi就是一个声明,首先它向编译器说明了该变量的存在,其次,由于在file1里面已经为Pi分配过地址了,所以在这里不需要再次分配地址了。
那么extern Pi就是一个声明。
初始化和赋值就简单很多了,定义时同时给出变量的值,叫初始化。对于已定义好的变量,重新给出其值就是赋值。
Int x=1;这就是初始化。
x=5;对已经初始化过的x再次赋值
对于变量来说,定义的同时赋值就是初始化,以后值再次改变的话就是赋值。
总结
好的总结一下,所有变量的操作:
extern int x;声明 int y;声明并定义 int z=1;声明,定义,初始化。 z=100;赋值。 |
扩展:
函数的声明和定义相对变量要明显很多:
Float ComputeArea(float x) { Return PI*x*x; } |
这就是定义,既给出了函数的名称,又给出了函数的实现。
有时,我们只需要指出函数是存在的,把具体的实现放在了最后,如:
Float ComputeArea(float x); |
这样没有具体实现的函数就是声明。