C++基础 -- 指针的定义和有效性
本博文由 西北工业大学MOOC 总结而来,以备以后回顾。(侵删)
1、指针的定义
1.1、地址和指针的概念
程序中的数据对象总是存放在内存中的,在其生命周期内这些对象占据一定的存储空间,有确定的存储位置
实际上,每个内存单元都有一个地址,即以字节为单位连续编码。编译器将程序中的对象名转换成机器指令能识别的地址,通过地址来存取对象值。
通过变量的方式存取变量值为直接访问,通过指针的方式存取变量值为指针间接访问。
(指针的详细概念参见其他博客)
1.2、指针的定义
C++将专门用来存放对象地址的变量称为指针变量。定义形式如下:
指针的类型:
指针的类型是指指针所指向对象的类型。指针本身存储的是地址值,所以指针的类型,就是所指对象所占存储空间的大小。
假定指针变量 p 的值是0x4000,下面三种写法
char *p; //1个字节
int *p; //4个字节
double *p; //8个字节
1.3、指针的间接访问
通过间接引用运算(*)可以访问指针所指向的对象或内存单元。
例:
int a, *p = &a; //& 取址符,将a的地址放到指针 p 中
a = 99; //直接访问a(对象直接访问)
*p = 100; //*p就是a,此时a=100。 间接访问a(指针间接访问)
*p = *p+1; //等价于a = a+1
例:
应用例:
int main()
{
int i=100, j=200;
int *p1, *p2;
p1=&i, p2=&j; //p1指向i,p2指向j
*p1 = *p1+1; //等价于i=i+1;
p1 = p2; //将p2的值赋值给p1,则p1指向j
*p1 = *p1+1; //等价于j=j+1;
return 0;
}
1.4、指针的初始化
由于指针数据的特殊性,其初始化和赋值运算是有约束条件的,只能使用以下四种值:
1)0值常量表达(空指针)。
2)相同指向类型的对象的地址(指针初始化)。
3)相同指向类型的另一个有效指针(指针间的赋值运算)。
4)对象存储空间后面下一个有效地址,如数组下一个元素的地址。
2、指针的有效性
指针指向一个有确定存储空间的对象(称为已知对象),则改指针是有效的。否则,称为指针是无效的。无效指针使用间接引用运算几乎总会导致崩溃性的异常错误。
2.1、无效指针的几种情况
1)如果指针的值为0,称为0值指针,又称空指针(null pointer),空指针是无效的。
2)如果指针未经初始化,或者没有赋值,或者指针运算后指向未知对象,那么该指针是无效的。
3)一个指针曾指向一个已知对象,在对象的内存空间释放后,虽然该指针仍指向原来的地址,但指针所指的已是位置对象,称为“迷途指针”(dangling pointer)。
3、指针的运算
指针的运算都是作用在连续存储空间上才有意义。比如几个单独的变量在存储空间上是不连续的,而数组等在存储空间上是连续的。
3.1、几种常用的指针运算
1)指针加减整数运算
2)指针变量的自增自减运算
设p是一个指针变量,其自增自减运算包括p++、++p、p- -、- -p等形式。
3)两指针相减运算
设 p1、p2是相同类型的两个指针(变量或常量),则 p2 - p1 的结果为两个指针之间对象的个数,如果 p2 的地址值大于 p1,结果为正,否则为负。
p1 指向数组 x 的第一个元素, p2 指向数组 x 的最后一个元素, p2-p1 的结果就是两个指针之间间隔元素的个数。实际运算过程为:(p2的地址值-p1的地址值)/指针所指类型所占字节大小。(char除以1,int型除以4,double除以8)
4)指针的关系运算
设p1、p2是同一个指向类型的两个指针(常量或变量),则 p2 和 p1 可以进行关系运算,用于比较两个地址的位置关系。
4、指针的const限定
4.1、指向const对象的指针(对象只读型)
一个指针变量可以指向只读型对象,称为指向const对象的指针。该类指针不能通过指针修改所指对象的值,但是可以修改指着的所指对象。定义形式为:
即在指针变量定义前加const限定符,其含义是不允许通过指针来改变所指向的const对象的值。
指向const对象的指针既可以指向const对象,也可以指向非const对象。
把一个const对象的地址赋给一个非const对象的指针变量是错误的,例如:
允许把非const对象的地址指向const对象的指针;不能使用指向const对象的指针修改指向对象的。但由于const指针指向的是一个非const对象,所以可以通过其他方式修改所指对象的值。例如:
****实际编程中,指向const对象的指针常用作函数的形参,以确保传递给函数的实参对象在函数中不被修改:
4.2、const指针(指针只读型)
一个指针变量是可以只读,称为const指针。在运行的过程中,该类指针不能修改所指的对象,但是可以修改所指对象的值。定义为:
4.3、指向const对象的const指针
可以定义指向const对象的const指针。该类指针,既不能修改所指的对象,也不能修改所指对象的值。形式为: