zoukankan      html  css  js  c++  java
  • 指针引用地址的笔记

    地址
    在C++ 中,地址标号使用十六进制表示。取一个变量的地址使用“&”符号,只有变量
    才存在内存地址,常量没有地址(不包括const定义的伪常量)。例如,对于数
    字100,我们无法取出它的地址。取出的地址是一-个常量值,
    无法再对其取地址了。
    2.指针
    指针的定义使用“TYPE*",TYPE 为数据类型,任何数据类型都可以定义指针。指针本
    身也是一种数据类型,也就是说TYPE*也是数据类型,所以例如int* A,A代表的就是某个地址,int*是数据类型而已。它用于保存各种数据类型在内存中的地址。指针变量同样可以取出地
    址,所以会出现多级指针。
    由于指针保存的数据都是地址,所以无论什么类型的指针都占4个字节,即指针本身占4个字节,它的数据类型解释的是对应地址的数据而已可不是指针,指针只保存了存放数据的首地址,并没有说在哪里结束,所以就是数据类型来决定数据的结束地址
    例如,同一地址,不同的数据类型进行访问,取出的内容也不一样
    所以我们有
    2.1各类型指针的工作方式如下
    使用了int char short三种方式对变量nVar的地址进行解释。变量nVar在内存中的数
    首地址从“78”开始。指针pnVar为int类型指针,以int 类型在内存
    据为“78 5634 12”,
    中占用的空间大小和排列方式对地址进行解释,然后取出数据。int类型占4字节内存空间,
    以小尾方式排列,取出内容为“12345678”,是一个十六进制的数字。同理,pcVar、psnVar
    将会按照它们的指针类型对地址数据进行解释。指针的取内容操作分为两个步骤:先取出指
    针中保存的地址信息,然后针对这个地址进行取内容,也就是一个间接寻址的过程,这也是
    识别指针的重要依据。该示例运行结果如下。
    12345678
    00008078
    30305678
    Press any key to ont inue
    如上各类型指针解释地址的结果
    通过上述的指针取内容的过程可得出结论,所有类型的指针对地址的解释都取自于自身指针类型。
    2.2.1指针支持的运算
    指针都支持哪些运算符号呢? 在C++ 中,所有指针类型只支持加法和减法。指针是用于
    保存数据地址、解释地址而存在的。因此,只有加法与减法才有意义,其他运算对于指针而
    言没有任何意义
    2.2.1.1指针加法
    指针加法用于地址偏移,但指针的加法并不像数学中的加法那样简单。指针加1后,指
    针内保存的地址值并不一定会加1,具体的值取决于指针类型,如指针类型为int,地址值将
    会加4。这个4 是根据类型大小所得到的值。C++ 为什么要用这种烦琐的地址偏移方法呢?
    当指针中保存的地址为数组首地址时,为了能够利用指针加1后访问到数组内下一成员,所
    以加的是类型长度,而非数字1,
    2.2.1.2所以我们得出指针寻址公式:
    目标地址=首地址加偏移量
    type*p;
    p+n的目标地址=首地址+sizeof(指针类型)*n{n为指针移动的次数}
    2.2.1.3指针减法
    套用公式,得到的地址值会小于首地
    在偏移量为负数的情况下,也可以运用此公式。
    址,这时指针是在向后进行寻址。所以指针可以做减法操作,但乘法与除法对于指针寻址而
    结果为有符号整
    言是没有意义的。两指针做减法操作是在计算的两个地址之间的元素个数,
    数,进行减法操作的两指针必须是同类指针相减。可用于两指针中的地址比较,也可用于其
    他场合,比如求数组元素个数,其计算公式如下:
    type *p,*q; /1这里用type泛指某类型的指针
    11省略指针赋值代码
    P-q= ((int)p- (int)q) /sizeof(指针类型type)
    另外,两指针相加也是没有意义的。
    将指针访问公式与指针寻址公式相结合后,可针对所有类型的指针操作。在实际运用中
    要灵活使用。同时也要谨慎操作,以免将指针指向意料之外的地址,错误地修改地址中的数
    据,造成程序的崩溃。
    一般做加减就是 type*p ,*q
    (int)p-(int)q这样,*p就是它的数据内容了
    指针加1也就是p+1

    指针也是一种变量,所以他也可以&取出自己的地址

    指针可以根据指针类型对地址对应的数据进行解释。而一个地址值无法单独解释数据,
    对于图中0X0012FF68 这个地址值,
    仅仅凭借它自己无法说明该地址处对应数据的信息。
    如果是在一个int 类型的指针中保存这个地址,就可以将0X0012FF68 这个地址值看做是int
    类型数据的起始地址,向后数4 字节到0X0014FF6C处。将0x0012FF68~0x0014FF6C 中的
    数据按整型存储方式解释

    引用
    引用的定义使用“TYPE&”,TYPE 为数据类型。在C++中是不可以单独定义的,并且
    在定义时就要进行初始化。引用表示一个变量的别名,对它的任何操作,本质上都是在操作
    它所表示的变量.虽然引用是变量的别名,但是实际上引用就是指针
    ,引用的存储方式和指针都是一样的,都是使用内存空间存放地址值,它们的小区别不过是引用是通过编译器实现寻址,而指针要手动寻址,指针虽然灵活但是容易失误,但是引用却没有这样的问题,所以从C++大力提倡引用

    地址                                    指针
    常量,内存标号                                      变量,保存变量地址                    
     不可修改                                                可修改,再次保存其他变量地址                
    不可执行取地址操作                    可以对其执行取地址操作得到地址
    仅仅有地址值无法解释数据              包含对保存地址的解释信息
    指针和地址之间的共同点。        
    地址                            指针
    取出地址对应内存中的数据              取出指向地址内存中的数据
    偏移后取数据,自身不变                  对地址偏移后取数据
    求两个地址的差                        求两个地址的差

  • 相关阅读:
    程序员面试中有几大法则
    css 页面重绘和回流(重排)以及优化
    (一)Windows下安装RabbitMQ服务
    NOT IN 和 OR 的SQL语句优化
    java更改图片格式,,更改图片大小,并实现多线程上传图片。
    数据库根据坐标查找附近的店铺
    Spring MVC接收提交文件图片的两种方式
    搜索引擎选择: Elasticsearch与Solr
    redis
    浅谈分布式事务
  • 原文地址:https://www.cnblogs.com/L-Sunny/p/8510246.html
Copyright © 2011-2022 走看看