指针引用地址的笔记
地址
在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++大力提倡引用
地址 指针
常量,内存标号 变量,保存变量地址
不可修改 可修改,再次保存其他变量地址
不可执行取地址操作 可以对其执行取地址操作得到地址
仅仅有地址值无法解释数据 包含对保存地址的解释信息
指针和地址之间的共同点。
地址 指针
取出地址对应内存中的数据 取出指向地址内存中的数据
偏移后取数据,自身不变 对地址偏移后取数据
求两个地址的差 求两个地址的差