“指针是什么?”“指针就是一种数据类型。”“你确定?”“那数据类型是什么?额,这个???类型就是类型,还能怎么解释嘛。”“指针有多少种?”“指针有好多种,比如整型指针,字符指针等等。”“指针是怎么确定分类的?”“就是声明时在变量类型后加个*声明指针呀。”等等。这是我们对指针对基本的认识,可是指针到时是什么,什么是指针类型,指针的值和指针本身怎么区别,几乎初学者都凌乱了。给个简单的指针使用,倒还可以看明白,问点复杂的就懵了,到头来很委屈的回一句,“老师没教呀!”。
     似乎初学者都有这样那样的无助,都寄希望与老师,可是自己没有基础,老师说了自己也听不懂,问了也白问,心里瘆的慌。问同学吧,也都和自己差不多,就算懂的也说不出个所以然,真是“茶胡子煮饺子”。
    作为初学者到深入的我来说,没有老师的直接灌输,完全自己摸索成长,对于初学者的心理是完全明白,也知道为什么会有这么多的困惑。应试教育基本都是灌输,学生没有自主思考的机会,导致只能被动的接受,从而不能够深入。那么我将以自学者的角度深入分析指针,抛开书本中的条条框框,让你真正自由的学习指针的精髓。如果没有一个自由的心,将无法捕捉自由的指针的灵魂。
    扯多了,进入正题。看完本文,相信第一次可能还不完全明白,但是一定要形成一种印象,然后多看几遍,在敲代码的过程中彻底理解,光靠看书是不可能完全理解的,一定要敲代码中思考才能掌握,但是文章会给你一个正确的方向,助你快速理解指针。
    指针是一种数据类型,占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. ConcurrentHashMap完全解析(jdk6/7,8)

    并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap ...

  2. SQL 课程 连接查询

    今天,我主要是对前面所学习过的子查询进行了复习,然后学习了连接查询join on 的内容. 如: select renyuan.code,name,age ,sex , bumen.bname,bce ...

  3. 使用node.js创建第一个应用

    node.js应用组成部分 1.引入require模块:我们可以使用require指令来载入Node.js模块. 2.创建服务器:服务器可以监听客户端的请求,类似于Apache,Nninx等HTTP服 ...

  4. Flask -- 内容管理系统

    例子: # content_manager.py # 把TOPIC存在一个字典里,key为关键字,value为二维数组# TOPIC_DICT['Django'][0]为Title,TOPIC_DIC ...

  5. bug--Unable to add window –token is not valid; is your activity running?

    错误原因是Dialog在show的时候必须要有一个activity作为窗口载体,上面的日志的意思是承载Dialog的activity已经被销毁了,不存在了 解决方法: 1.粗暴一点直接try catc ...

  6. MFC创建动态链接库DLL并调用方法详解

    实例一: 1.创建一个动态链接库工程,如login_dll. 2.在原工程头文件或者新建头文件如showdlg.h定义动态链接库的导出函数,代码如下: #include "stdafx.h& ...

  7. leetcode383

    已知两个字符串,然后比较一个字符串是否来自另一个字符串,没有顺序要求. 简单题,用一个数组保存前一个字符串的每一个字符出现的次数,然后循环后一个字符串去检查,如果次数不够了,那么就返回false pu ...

  8. Chapter 1 First Sight——28

    "Which one is the boy with the reddish brown hair?" 那个红褐色头发的男孩是谁? I asked. I peeked at him ...

  9. sort函数使用的基本知识

    STL中就自带了排序函数sortsort 对给定区间所有元素进行排序  要使用此函数只需用#include <algorithm> sort即可使用,语法描述为:sort(begin,en ...

  10. log4cxx 使用代码进行配置

    (1)官网的一个例子 #include <log4cxx/logger.h> #include <log4cxx/helpers/pool.h> #include <lo ...