理解常量指针和指针常量

来源:互联网 发布:jquery数组删除元素吗 编辑:程序博客网 时间:2024/05/23 01:23

之所以会出现常量指针和指针常量都拜一个关键字const所赐,或许可以这么说,是const关键字使得情况变得更加有趣。

常量指针

如何声明一个常量指针,如下:
int const *pa
如何理解呢?
首先看定义,它叫“常量指针”,这四个字前两个是定语用来修饰后面的指针,因此它实际想表达的结果是:他是一个指针
其次更深层次来理解它,在声明int const*pa中它首先是一个定义了指针pa,然后这个指针所指向的内容被const修饰,那么这个指针所指向的结果是一个常量。总结,int const *pa 它定义了一个指针p,这个指针所指向的是一个int型的常量。

指针常量

声明如下
int b = 10;
int *const pb = b;
首先看定义,指针是定语来修饰常量,那么它的本质是一个常量。
在声明int *const pb中定义了一个常量pb并且用指针来修饰它,那么pb的值就是一个常量指针。(注因为指针常量是一个常量,在声明的时候一定要给它赋初始值。一旦赋值,以后这个常量再也不能指向别的地址)

看完概念之后我们来分析他们的用法和区别

这里写图片描述

上面分别定义了常量指针和指针常量,运行上面的代码会出现如下错误:

这里写图片描述

所以我们来研究一下const到底做了什么。
常量指针pa:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。
即pa = &c完全可以,但 *pa = c用来改变pa所指向的内容并不可以。
在定义中起始已经解释了,但是缘何并且如何理解呢?
可以看到int const *pa = &a;const修饰的是*pa,因此指针指向的内容不能改变即*pa不能修改。但pa的值是可以修改的。
指针常量pb:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。
同上,可以理解const封锁了pb而不是*pb,因此pb不可以修改,但是*pb可以修改。

常量指针的用处

使用字符串处理函数的时候,应该会注意到这些函数的声明。字符串比较函数的声明是这样的
int strcmp(const char *des, const char *src);
函数的参数声明用了常量指针的形式,就保证了在函数内部,那 个常量不被更改。也就是说,对des和src的内容更改的操作在函数内部是不被允许的

0 0
原创粉丝点击