“指针是什么?”“指针就是一种数据类型。”“你确定?”“那数据类型是什么?额,这个???类型就是类型,还能怎么解释嘛。”“指针有多少种?”“指针有好多种,比如整型指针,字符指针等等。”“指针是怎么确定分类的?”“就是声明时在变量类型后加个*声明指针呀。”等等。这是我们对指针对基本的认识,可是指针到时是什么,什么是指针类型,指针的值和指针本身怎么区别,几乎初学者都凌乱了。给个简单的指针使用,倒还可以看明白,问点复杂的就懵了,到头来很委屈的回一句,“老师没教呀!”。
     似乎初学者都有这样那样的无助,都寄希望与老师,可是自己没有基础,老师说了自己也听不懂,问了也白问,心里瘆的慌。问同学吧,也都和自己差不多,就算懂的也说不出个所以然,真是“茶胡子煮饺子”。
    作为初学者到深入的我来说,没有老师的直接灌输,完全自己摸索成长,对于初学者的心理是完全明白,也知道为什么会有这么多的困惑。应试教育基本都是灌输,学生没有自主思考的机会,导致只能被动的接受,从而不能够深入。那么我将以自学者的角度深入分析指针,抛开书本中的条条框框,让你真正自由的学习指针的精髓。如果没有一个自由的心,将无法捕捉自由的指针的灵魂。
    扯多了,进入正题。看完本文,相信第一次可能还不完全明白,但是一定要形成一种印象,然后多看几遍,在敲代码的过程中彻底理解,光靠看书是不可能完全理解的,一定要敲代码中思考才能掌握,但是文章会给你一个正确的方向,助你快速理解指针。
    指针是一种数据类型,占4个字节。为什么指针的类型需要和具体的类型相关呢?比如,你不能说指针就是一种类型,而只能附带一种指向的类型来确定指针的类型。初学者很不理解这个意思,为什么指针还要依赖其他类型来确定类型呢?那么,如果你也这样问了,恭喜你,你慢慢上道了,不过,更可喜的是,本文可以加速你的思考,助你成功。现在,我们展开深入的分析了。下面请认真的阅读哦。
    在计算机中,变量存储,指针,数据类型等等,都是反映在内存中的,当然这个内存指的是虚拟内存。虚拟内存,简单来说,就是我们程序使用的内存,不是真正的内存条内存,不过程序运行后,虚拟内存会映射到实际的内存条内存即物理内存。了解虚拟内存,请阅读计算机操作系统内存章节。我们理解的程序中的内存都是虚拟内存,你当做是内存就是了。这个不清楚对我们程序理解没多少影响,有个概念就行了,继续往下看。
    32位计算机只支持4GB内存大小,多出的是无效的,即使你装了8GB内存条,也只能使用4GB,为什么最多只支持4GB呢,这就跟指针有关系了。计算机使用一个计算机字,32位的计算机就是32位,也就是4字节,因此这也就是为什么我们所知道的指针所占的内存是4字节的原因。因为我们的计算机普遍是32位的,也就是支持的最大内存是4GB,使用32位即4字节的指针就能够找到4GB的所有内存位置。如果将来4GB内存不够用,普及了64位的计算机,支持的内存大小就是2的64次方byte,远远超过了4GB,那么32位指针就找不到超出4GB以外的内存了,所以就不够了。因为32位指针所能表示的最大内存地址为2的32次方减一byte。所谓的不支持就是因为指针所能表示的范围没有内存的地址范围大,找不到全部的地址。
    在目前的内存体系中,内存地址排序是线性的,也就是,32位地址(4GB内存)从地址0x00000000到0xFFFFFFFF 。因为是线性的体系结构,因此,内存地址都是按照序号递增的,如0,1,2,3,...,这样就表示了内存地址,当然,因为是用十六进制带前导0表示的。因此地址就是我们常见的0x00000000,0x00000001,0x00000002,0x00000003,...。正是因为是线性的,因此,根据这个序号就能够轻松的找到相应的内存地址,对内存进行读写。那么内存地址其实就是一个编号,从0开始的,指针所占内存的位数就决定了能表示的数字的大小,这个表示的数字就是内存地址。32位即4字节指针只能表示4GB内存,这也是我们现在知道的。所以,对于指针的认识,指针所占的大小就是这个意思,请反复揣摩。
    那么我们在来看看数据类型。所谓的数据类型,在编程上我们理解成一种类型,但是本质的就是一个数据所占的内存的大小。比如整型占4字节,编译器把整型变量存放到内存中,就给一个4字节的内存来存储一个整数,这就是整型的意义。其他类型意义和这类似,当然除了指针。因为指针很特殊。指针的类型要依托其他的类型来定义,因为指针是找内存地址而存在的,因此,它也就不一般了。指针为4字节,也就是说,指针有能力走遍4GB空间,表明它有这个潜力,但是每次走多远确实根据指针的类型来定的,如果指针指向整型,那么指针的值每次递增,也就是指针表示的内存地址在递增,这个递增的跨度就是指针指向变量类型所占字节的大小。比如,指向整型的指针int *p; p所指向的就是整型变量,所以p++;就是递增指针的值(内存地址)就是按照int型大小(4字节)每一次而增加的,如果开始指向的0字节,增加一次p的值就变成4字节了,再递增一次就是8字节了。而如果指向的是1字节的char * pc,那么pc每次递增就只增加1字节,如果第一次是0字节,递增一次,就是1字节了。其他类型也是如此类似的。如果指针不根据数据类型来确定指针类型,那么指针就不知道如何递增,无法确定指针每次增加的跨度。如果使用4字节的整型指针去指向8字节的double类型变量,那么每次递增只能递增到double类型的一半,从而double类型的变量就被截断,从而读取的数据就错误了。所以这就是指针类型的意义。同样,这一段也要反复揣摩,虽然讲的很通俗,但是要把自己一直以来形成的思维冲破,需要努力几次,才能完全接受这种本质的理解。如果之前这样思考过,那么你就轻而易举的理解了。
    把指针这样理解后,以后再来理解其他的,就能够游刃有余了。后续还会写指针与数组,指针常量和常量指针,内存读写保护和指针的操作关系,等等。但是,请先把这篇文章理解了,方可继续,否则还是会因为思维没扭转过来而疑惑重重。
    如果有疑问,请在文章后提出,不然,自己不主动,永远都别想学好。我给大家提供一个机会,请好好把握。现在不是没人帮你学了,关键就看看你想不想沉下心学下去。如果能够做到,你将会很快成为高手。
    提醒一下,上面所讲述的内容,我是结合了操作系统,内存管理,计算机组成原理,C/C++程序设计等知识的综合,所以讲述的深入浅出,如果自己一下子理解不透彻,请勿沮丧,那是要有一定的基础才能够理解透彻的。只要能够从本文中扭转自己的思维,你就成功了。思维才是最重要的,当然,如果你能够全部吸收了,那就更要恭喜你了。助你成功,好好加油!!

指针--摘自C++技术网 作者dx的更多相关文章

  1. Salt自动化之自动更新Gitfs-爱折腾技术网

    Salt自动化之自动更新Gitfs-爱折腾技术网 pygit2

  2. 81For全栈技术网

    你想了解前端吗? 你想了解后端吗? 你想了解设计吗? 81For全栈技术这里包含了互联网所有内容,81For.com是全栈技术网,包括:前端.后端.全栈.jquery.vue.react.router ...

  3. Delphi 中DataSnap技术网摘

    Delphi2010中DataSnap技术网摘 一.为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7 ...

  4. 从程序员到CTO的Java技术路线图 作者:zz563143188

    在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高级特性 反射.泛型. ...

  5. Delphi2010中DataSnap技术网摘

    一.为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7该下岗了. DataSnap有三种服务模式,其中 ...

  6. 测试技术/网游Bug分析/单机修改 视频教程

    早期做的一些视频,测试技术/Bug讲解/单机修改,有兴趣的同学自行下载看吧 由于是早期录制的,有口误多包涵... 链接: http://pan.baidu.com/s/1i5JUKPf 密码: a1x ...

  7. 【摘自lvs官网】lvs介绍

    Linux Virtual Server项目的目标 :使用集群技术和Linux操作系统实现一个高性能.高可用的服务器,它具有很好的可伸缩性(Scalability).可靠性(Reliability)和 ...

  8. HTTP响应码摘自apach官网

    HTTP状态列表 响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行. 响应码分五种类型,由它们的第一位数字表示: 1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接 ...

  9. VR虚拟现实技术在教育领域的前景展望

    VR虚拟现实技术在教育领域的前景展望 VR虚拟现实技术能迅速火起来,是基于它突破了人们对三维空间在时间与地域上的感知限制,以及市场需求愿景的升级.此技术可广泛地应用到城市规划.室内设计.工业仿真.古迹 ...

随机推荐

  1. PHP中使用CURL(四)

    为了安全,我们的web服务主机往往不能上网.维护的时候,也是通过跳板机,ssh登录后去操作.有时候我们的程序需要访问外网.比如需要调用外网其他程序的某个接口.这时可以通过PHP的CURL函数的CURL ...

  2. JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍(转载)

    这里是JavaScript中制作滚动代码的常用属性 页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见 ...

  3. 711B - Chris and Magic Square 模拟

    题目大意:在num[i][j]==0处填一个数使每行,每列,对角线的和相同,若果有多种答案输出一种. 题目思路:模拟 #include<iostream> #include<algo ...

  4. Jquery EasyUI datagrid后台数据表格生成及分页详解

    由于项目原因,网站后台需要对用户信息进行各种操作,有时还需要进行批量操作,所以首先需要将用户信息展示出来,查了不少资料.发现Jquery EasyUI确实是一个不错的选择,功能强大,文档也比较全面,而 ...

  5. chrome插件:打开新tab时自动打开百度

    下载 安装: 解压到某一目录 如要修改自动跳转链接:修改go.js中的url (function (){ chrome.tabs.getCurrent(function(tab){ chrome.ta ...

  6. 标准IO库

    IO标准库类型和头文件

  7. OpenCV成长之路:图像直方图的应用

    OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...

  8. hdu_5748_Bellovin(LIS)

    题目链接:hdu_5748_Bellovin 题意: 给你一个数列ai,设f(a1,a2,a3,..an)=(f1,f2,f3,...,fn),其中fi表示以ai结尾的最长递增子序列长度,注意:必须要 ...

  9. 素数槽csuoj

    超时代码: #include <iostream> using namespace std;//写一个函数判断是否是素数bool isPrime(int num){int i=2;//co ...

  10. flash检测网络是否通畅

    air: 要在 Adobe ® Flash ® Professional(CS4 或更高版本)中使用 air.net 包: 选择“文件”>“发布设置”命令. 在 Flash 面板中,单击 Act ...