指针漫谈(三):有关指针初始化的问题
来源:互联网 发布:安卓手机检测软件 知乎 编辑:程序博客网 时间: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
- 指针漫谈(三):有关指针初始化的问题
- 指针漫谈(四):再论指针初始化的问题
- 有关指针初始化的误区
- 指针的初始化问题
- 指针漫谈(二):指针的美
- 有关函数指针的问题(转载)
- 有关函数指针的问题
- 指针初始化引出的问题
- 指针初始化的小问题
- C语言实现栈,对栈初始化的指针有关问题
- 有关野指针问题
- 有关指向指针的指针
- 指针漫谈
- C++ : 指针及其有关的问题
- C++与指针有关的问题
- 有关于指针函数的问题
- 有关butterknife空指针异常的问题
- 指针初始化问题
- windows中计算进程CPU占用率(一)
- 文章标题
- CocoaPods Podfile--编写格式
- 2、页面置换算法
- Java基础——赋值文档及图片
- 指针漫谈(三):有关指针初始化的问题
- Android获取验证码倒计时功能(Timer实现)
- Linux安装gcc和g++
- 2016/11/10
- springMVC上传文件大小限制以及超过限制后的自定义处理
- 趣味取小数
- 小论软件工程(C编码实践篇)
- 2016/11/11
- hadoop HA 配置下api读取文件