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

时间:2008-10-20 21:07:21

标签: c++ c const

我经常使用const对象的指针,就像这样......

const int *p;

这仅仅意味着您无法通过p更改p指向的整数。但是我也看到了const指针的引用,就像这样声明......

int* const p;

据我了解,这意味着指针变量本身是常量 - 你可以改变它整天指向的整数,但是你不能指出其他东西。

会有什么用处?

11 个答案:

答案 0 :(得分:28)

当你为嵌入式系统设计C程序,或者需要引用相同内存的专用程序(共享内存的多处理器应用程序)时,你需要不断的指针。

例如,我有32 bit MIPs processor附加了little LCD。我必须将我的LCD数据写入内存中的特定端口,然后将其发送到LCD控制器。

我可以#define那个数字,但是我还必须将它作为指针投射,而C编译器在我这样做时没有那么多的选项。

此外,我可能需要它是volatile,也可以是强制转换,但使用提供的语法更简单,更清晰 - 一个指向易失性内存位置的const指针。

对于PC程序,一个例子是:如果你设计DOS VGA游戏(有在线教程,这是很有趣的学习基本的低级图形),那么你需要写入VGA内存,可能会被引用作为const指针的偏移量。

- 亚当

答案 1 :(得分:27)

它允许您保护指针不被更改。这意味着您可以根据指针永不改变或无意修改来保护您所做的假设,例如:

int* const p = &i;

...

p++;     /* Compiler error, oops you meant */
(*p)++;  /* Increment the number */

答案 2 :(得分:7)

另一个例子: 如果你知道它被初始化的地方,你可以避免将来的NULL检查。 编译器保证指针永远不会改变(为NULL)...

答案 3 :(得分:6)

在任何非const C ++成员函数中,this指针的类型为C * const,其中C是类类型 - 您可以更改它指向的内容(即成员),但您无法将其更改为指向C的其他实例。对于const个成员函数,this的类型为const C * const。还有(很少遇到)volatileconst volatile成员函数,this也有volatile限定符。

答案 4 :(得分:5)

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

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

答案 5 :(得分:3)

与“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。

答案 6 :(得分:3)

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

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

答案 7 :(得分:2)

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

答案 8 :(得分:1)

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

我当然没有数据来支持这种预感,但我还是会打赌。

答案 9 :(得分:0)

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

答案 10 :(得分:-2)

始终将指针视为int。这意味着

object* var;

实际上可以被认为是

int var;

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

const object* var;

变为

const int var;

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