const指针有什么用(与指向const对象的指针相对)?

我经常使用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成员函数, thisconst C * const类型。 还有(很少遇到) volatileconst volatile成员函数, this也有volatile限定符。

一种用途是在低级(设备驱动程序或嵌入式)代码中,您需要引用映射到输入/输出设备(如硬件引脚)的特定地址。 有些语言允许您链接特定地址的变量(例如Ada use at )。 在C中,最常用的方法是声明一个常量指针。 请注意,此类用法还应具有volatile限定符。

其他时候它只是防御性编码。 如果你有一个不应该改变的指针,那么声明它不能改变是明智的。 这将允许编译器(和lint工具)检测错误的修改尝试。

当我想避免意外修改指针(例如指针算法或函数内部)时,我总是使用它们。 您也可以将它们用于Singleton模式。

‘this’是一个硬编码的常量指针。

与“const int”相同……如果编译器知道它不会改变,那么它可以是基于此的优化假设。

 struct MyClass { char* const ptr; MyClass(char* str) :ptr(str) {} void SomeFunc(MyOtherClass moc) { for(int i=0; i < 100; ++i) { printf("%c", ptr[i]); moc.SomeOtherFunc(this); } } } 

现在,编译器可以做很多事情来优化该循环---只要它知道SomeOtherFunc()不会改变ptr的值。 使用const,编译器知道,并且可以做出假设。 没有它,编译器必须假设SomeOtherFunc将改变ptr。

我已经看到一些OLE代码,其中有一个对象从代码外部传入并使用它,你必须访问它传入的特定内存。所以我们使用const指针来确保函数总是操纵值比通过OLE接口进来。

已经给出了几个很好的理由作为这些问题的答案(内存映射设备和简单的旧防御编码),但是我愿意打赌大多数情况下你看到它实际上是一个错误而且意图是item是指向const的指针。

我当然没有数据来支持这种预感,但我仍然会下注。

类型*const类型*视为类型本身。 然后,您可以看到为什么您可能希望拥有这些类型的const。

总是把指针想成一个int。 这意味着

 object* var; 

实际上可以被认为是

 int var; 

所以,一个const指针只是意味着:

 const object* var; 

 const int var; 

因此你不能改变指针指向的地址,那就是全部。 为了防止数据更改,您必须使其成为指向const对象的指针。