const与指针

来源:互联网 发布:oracle sql修改字段名 编辑:程序博客网 时间:2024/05/22 19:26

I 指向常变量的指针变量

形如:constint *p = &a;

这种形式类似于以下形式:

*p = &a;

const int m = a;(这里m为*p)

这里m为一个只读变量,而p只是对变量a地址的一个引用,m的值为一个常变量的值。这里const只保证引用之后的值是一个常值,并不意味着a的值就不能改变,p的值也不能改变。打个比方,这里有一个物品,他的所有者是a,m只有对这个物品的使用权,却没有这个物品的修改权。所有着可以对这个物品随意改变,但是使用者就不行。因此我可以通过改变a的值来改变m的值,也就是*p的值。而*p的值是不可以改变的,这只是表示不能通过*p来改变a的值,因为它只有使用权,但是p的值是可以改变的。const只能限定通过引用a的地址之后*p的值不能改变但并不能限定p的值不能改变。所以可以通过改变p的值来改变常变量的值。例如:

Int a = 10;

Int b = 100;

const int *p = &a;

a = 20 (合法的改变,因为a是这个物品的所有者,可对这个物品进行人任意操作)

*p = 20 (错误,*p只拥有使用权,没有修改权)

P = &b (合法,const对p并无限制)

II常指针

形如:int*const p = &a;

这里的const只能限制p的值不能改变,不能限定*p的值。由于p保存的是a的地址,*p可以随意改变,因此可以通过*p改变a的值。也就相当于p永远是a在内存中的地址,但是a的值是可以改变的。*p的值就是a的值。同时也可通过改变a的值来改变*p的值。

III指向常量的常指针

形如:

const int * const p= &a;

这里第二个const限定的是p是一个常指针变量,永远是a的地址,p的值是不能被改变的。而第一个const限定的是不能通过*p来改变a的值。

如同:

Int a = 10;

Int b = 100;

const int * const p= &a;

P = &b(错误。受第二个const限制)

*p =b(错误,受第一个const限制)

a = 20 (合法)

也就是相当于这种情况是上面两种情况的综合。如果限定a的值也不能自己改变,可以这样定义:

constint a = 10;
0 0