我经常使用const对象的指针,就像这样......
const int *p;
这只是意味着您无法更改p
指向的整数p
.但是我也看到了const指针的引用,这样宣称......
int* const p;
据我所知,这意味着指针变量本身是不变的 - 你可以改变它整天指向的整数,但你不能指出其他东西.
有什么可能的用途?
当您为嵌入式系统设计C程序,或者需要引用相同内存的专用程序(共享内存的多处理器应用程序)时,您需要不断的指针.
例如,我有一个32位MIPs处理器,它附有一个小LCD.我必须将我的LCD数据写入内存中的特定端口,然后将其发送到LCD控制器.
我可以#define那个数字,但是我还必须将它作为指针投射,而C编译器在我这样做时没有那么多的选项.
此外,我可能需要它是volatile,也可以是cast,但使用提供的语法更容易和更清晰 - 一个指向易失性内存位置的const指针.
对于PC程序,一个例子是:如果你设计DOS VGA游戏(有在线教程很有趣,可以学习基本的低级图形),那么你需要写入VGA内存,这可能被称为偏移来自const指针.
-亚当
它允许您保护指针不被更改.这意味着您可以根据指针永不改变或无意修改来保护您所做的假设,例如:
int* const p = &i; ... p++; /* Compiler error, oops you meant */ (*p)++; /* Increment the number */
另一个例子:如果你知道它被初始化的地方,你可以避免将来的NULL检查.编译器保证指针永远不会改变(为NULL)...
在任何非const C++成员函数中,this
指针都是类型C * const
,其中C
是类类型 - 您可以更改它指向的内容(即其成员),但是您无法将其更改为指向不同的实例C
.对于const
成员函数,this
属于类型const C * const
.还有(很少遇到)volatile
和const volatile
成员函数,其中this
也有volatile
限定符.
一种用途是在低级(设备驱动程序或嵌入式)代码中,您需要引用映射到输入/输出设备(如硬件引脚)的特定地址.某些语言允许您链接特定地址的变量(例如Ada use at
).在C中,最常用的方法是声明一个常量指针.请注意,此类用法还应具有volatile
限定符.
其他时候它只是防御性编码.如果你有一个指针不应该改变它是明智的,声明它,使得它不能改变.这将允许编译器(和lint工具)检测错误的修改尝试.