指针漫谈(三):有关指针初始化的问题

来源:互联网 发布:安卓手机检测软件 知乎 编辑:程序博客网 时间:2024/05/16 00:30

       最近才厘清指针初始化的问题,不知道大家有没有同样的困惑,就是指针的初始化到低干了些什么工作?到底是因为地址访问操作符给了指针变量的地址还是编译器分配的?

为了探讨清楚这个问题,我们先从普通变量看起,例如:

int a;printf("%p",a);a=10;printf("%d\n%p\n",a,a)
       在上面这段代码中我们想展示的是a这个整形变量初始化之前和初始化之后的地址和值,我们已经知道高级语言的一个特性就是可以使用变量的名字而不是变量的地址去访问内存中的值,那么变量的声明就是做了这样一个工作,通过名字而不是地址去访问硬件,这也就是高级语言优于汇编语言之处。

       我们想想对于变量a而言,在声明的时候并没有给它值,仅仅是起了名字,若作为全局变量来说,编译器将直接初始化为0,此时它的地址就是系统定好0000000。初始化就是给变量给值,这个过程中编译器会自动给变量分配一个地址。这个初始化之后a变量的地址就作为a变量的最终地址,也就是在该地址存储了10这个数。若对于static变量来说,从程序一开始到程序结束a变量始终占据这个地址,不会释放或者另做他用,但对于自由变量来说就是随用随销毁,在函数体中使用,完毕后就销毁。

        接下来再来看有关指针变量的初始化,我们必须先明白,对于指针而言,它的第一属性仍然是变量,其次才是指针。那它的初始化和普通的变量就应该没有实质的区别。来看一段代码:

int a=10;int *p;//声明p=&a;//绑定或者叫初始化
     在上面代码上我们声明了一个叫做*p的整形变量,为什么用间接访问操作符,其实就是一个指针变量的符号而已,只是编译器不允许你直接声明为p,否则你就可以使用p,从语言角度上讲用p也是也可以的。我们仔细思考下,作为全局变量p的地址和他的值在初始化之前是多少?p的值应该是0,地址应该也是内存地址为0000000的位置。初始化的过程就是给变量p给了新的存储空间,只不过这里初始化我们是p指向的地址联系在一起,但需要明白的是p的存储位置和a的存储位置是不一样的,不要误解为因为有&的操作,p的值就变成a的地址。用间接访问操作符解引用的过程才是将p指向的地址的内容拿出来,具体放在哪就是另一个话题了,我们需要明白的是*p的过程才是实质用a的值的过程,p的值并不是因为指针引起的,而是由于 本身是变量的原因。

     以上就是我对指针变量的初始化的一些理解,如有误,还望大虾予以指正!

0 0
原创粉丝点击