代码之家  ›  专栏  ›  技术社区  ›  Head Geek

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

  •  32
  • Head Geek  · 技术社区  · 17 年前

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

    const int *p;
    

    这只是意味着你不能改变整数 p 指向通过 p 。但我也看到了对const指针的引用,声明方式如下。..

    int* const p;
    

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

    那有什么可能的用途?

    11 回复  |  直到 17 年前
        1
  •  30
  •   Adam Davis    17 年前

    当你为嵌入式系统设计C程序,或者需要引用同一内存的特殊用途程序(多处理器应用程序共享内存)时,你需要常量指针。

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

    我可以#定义这个数字,但我还必须将其转换为指针,而当我这样做时,C编译器没有那么多选项。

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

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

        2
  •  29
  •   Andrew Johnson    17 年前

    它允许您保护指针不被更改。这意味着您可以保护基于指针做出的假设,使其永不改变或免受无意修改,例如:

    int* const p = &i;
    
    ...
    
    p++;     /* Compiler error, oops you meant */
    (*p)++;  /* Increment the number */
    
        3
  •  8
  •   Benedikt Waldvogel assylias    17 年前

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

        4
  •  6
  •   Adam Rosenfield    17 年前

    在任何非const C++成员函数中 this 指针的类型为 C * const ,在哪里 C 是类类型——您可以更改它指向的对象(即其成员),但不能将其更改为指向 C .为 const 成员职能, 属于类型 const C * const 也有(很少遇到) volatile const volatile 成员职能,其中 也有 不稳定的 合格者

        5
  •  5
  •   Michael Carman    17 年前

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

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

        6
  •  4
  •   Tom Ritter    17 年前

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

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

        7
  •  3
  •   James Curran    17 年前

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

        8
  •  2
  •   Dan Andreatta    17 年前

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

        9
  •  1
  •   Michael Burr    17 年前

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

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

        10
  •  0
  •   Shadow2531    17 年前

    思考 类型* const类型* 作为类型本身。然后,您可以看到为什么您可能想要这些类型的const。

        11
  •  -2
  •   DavidG    17 年前

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

    object* var;
    

    实际上可以被认为是

    int var;
    

    因此,const指针的简单含义是:

    const object* var;
    

    变成

    const int var;
    

    因此,你也不能改变指针指向的地址,仅此而已。为了防止数据更改,您必须将其设置为指向const对象的指针。