变量名与变量地址的一些理解

来源:互联网 发布:程序员的技术栈 编辑:程序博客网 时间:2024/06/14 09:03
    今天看了各位大咖写的博文,受益良多,我对变量名与变量地址的区别又有了进一步的了解。要想彻底理解变量名与变量地址,能有一些《计算机组成原理》里与存储器相关的知识储备,和《数据结构》里有关堆栈的内容。

不想点这个链接可以看此链接下面的截图

http://blog.csdn.net/u012503217/article/details/46564451

C中的内存分布

下面这篇博文详细论述了C语言内存分布的方式,仅作了解。

http://blog.csdn.net/youoran/article/details/10990815

这篇博文对于初学者来说不是很容易看懂,你可以先作为存货,日后再看,绝对有收获。其实目前不懂这些也没有什么太大的关系,接着往下看。你也可以像我这样,自己写个小程序去运行一下。

下面是我自己的一些理解,不权威,但至少也是我看了很多的相关内容所做的一些理解,应该还不太成熟,但至少对于第一次学C语言的人来说,作为初步理解是完全没有问题的。

    变量名是对某块地址的统称,这块地址占多少个空间,占多少个二进制代码,是取决于此变量名的类型。比如 int 整型,占的位置是四个空间(这4个空间是固定的,是取决与你的编译器的)。在内存中有一个专门的地方来存用户定义的变量。计算机通过变量名去找到变量地址,从而找到变量的地址里放的数据。举个例子:    #include<stdio.h>    int main()    {        int a;        printf("%d\n",a);        printf("%p\n",&a);        return 0;     }

这段代码的意思很明确:
int main()

定义一个整型变量a,但并不对其初始化;
输出a的值;
输出a的地址的值;
程序正常退出。

然后我们运行一下这个代码,得到的结果是:
这里写图片描述
在编译器没有warring 没有error 的前提下,这里我们看到这里并没有输出a的值,输出的只是a在内存中的地址,这个地址是十六进制输出,是一种 对应硬件存储单元的编号。我们不妨这样理解,C语言是面向程序设计的语言,为了方便程序员的记忆和理解,把长长的变量地址简记为a 。有兴趣你可以试一下,你的编译器,不管你定义一个变量的名字叫什么,叫a,b或者是c,对于 int 来说,第一个被定义的变量 的变量地址总是相同的。并且第一个变量的变量地址与第二个变量的变量地址 的差值,就是你第一个变量所占的存储内存空间个数。也就是说,你的变量地址的大小,是根据你定义变量的顺序和你所定义的变量的类型来决定的。(int 只是这里举的例子,对于char 、double等,只要是同一类型的,都是一样的道理。)
比如,你可以写一段这样的代码在你的编译器上试试:

    #include<stdio.h>    int main()    {        int a;        int b;         int c;        int d;        printf("%d\n",a);        printf("%p\n",&a);        printf("%d\n",b);        printf("%p\n",&b);        printf("%d\n",c);        printf("%p\n",&c);        printf("%d\n",d);        printf("%p\n",&d);        return 0;        }

运行 ,得到的结果是这样的:

这里写图片描述

在上面的那个运行结果,并没有输出变量的值(为什么?可以先作为一个问题保留一下,下次再讲),本次运行对于这些没有初始化的变量,有了输出的值,这些值是随机的(在这里看起来是在0、1之中随机噢,下次再做深入探讨)。然后我们仔细看一下这个变量地址的规律,第一个被定义的变量值最大,第二个被定义的次之,第三第四依次减小(这其实是类似于“栈”的存入方式:先定义的 先进去,存在栈底,数值最大;后定义的 后进去,存在栈顶,数值最小)。

我们可以清楚的看到,第一个和第二的变量地址差值为4 。正好与前面所说的一致。

为了证明我所说的地址的分配是按照我们定义变量的顺序来的,我们可以把第二段程序中的a、b的定义顺序换一下,不改变其输出顺序。
这里写图片描述
很明显,地址最大的那个,是在改动后的程序中最先定义的b 。

    我是一个有这谦卑姿态的学生,对所学的知识坚持弄清每一点的学生。如果上面写的有任何问题,欢迎批评与讨论。    这篇文章大概也没有人会看吧。这只是我的学习笔记,最后对我自己说一句:书山有路勤为径。    @青山遮不住 You bless me.
原创粉丝点击