关于c ++:const指针有什么用(与指向const对象的指针相反)?

What use are const pointers (as opposed to pointers to const objects)?

我经常用指针指向常量对象,比如…

1
const int *p;

这就意味着你不能改变p通过p指向的整数。但我也看到了常量指针的引用,声明如下…

1
int* const p;

正如我理解的那样,这意味着指针变量本身是常量——您可以更改它整天指向的整数,但不能使它指向其他东西。

有什么可能的用途?


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

对于本案,我有一个32位MIPS处理器,该处理器有一个小的LCD连接。我必须将我的液晶数据写入一个特定的存储器端口,然后输入到液晶控制器。

我可以定义这个数字,但我也必须将它作为一个指针,而C编译器在我这样做的时候没有很多选择。

再说,我可能需要挥发性,这也可能是一种铸件,但它很容易和清晰地使用句法——一个const指针指向一个不稳定的记忆位置。

对于个人电脑程序,一个例子是:如果你设计了一个DOS VGA游戏(有一个在线辅导,通过学习基本低水平图形很有趣),那么你需要写入VGA记忆体,该记忆体可能被作为一个康斯坦指针的胶印。

-亚当


它允许你保护指针从改变。This means you can protect assumptions you make based on the pointer never changing or from uninterentional modification,for example:

ZZU1


Another example:如果你知道它是初始化的,你可以避免未来的检查。编译器向你保证指针永远不会改变


在任何非CONSTC++Member Function中,this指的是C * const〔1〕型,C型〔1〕型〔1〕型〔2〕型〔1〕型〕型〔你可以改变它对(I.E.其成员)的意义,但你不能改变它到不同的C型Member Functions,thisIS of Type const C * const也有(稀有)volatileconst volatile成员的职能,因为this也有volatile的资格。


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

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


当我想避免统一修改指针时(例如指针算术或函数内的指针算法),我总是使用这些指针。你也可以用它们来模仿它们。

这是一个硬指针。


Same as a"const int".如果编译者知道这不会改变,则可以根据这一假设来进行最佳化假设。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
         }
    }
}

现在,编译器可以选择一位位位来优化环形----提供了一个知道某个有机()不改变PTR值。编译者知道这一点,并能作出假设。没有这一点,编译者必须假定有人会改变它。


我看到了一个代码,你在那里有一个物件从代码外经过,并与它一起工作,你必须访问它通过的特定记忆。因此,我们设置了指针,以确保函数总是操纵价值,而不是通过OLE界面。


提出了许多好的理由来回答这个问题(记忆映射设备和只是平原旧防御编码),但我愿意接受这样一个事实,即在你看到这个事实是错误的地方,最重要的是,它必须是一个指针——对-const。

我确信没有数据可以回到这一点,但我还是要做个更好的。


把类型&42;和const类型&42;想象成类型本身。然后,您可以看到为什么您可能希望拥有这些类型的常量。


总是把指针当作一个内部。这意味着

1
object* var;

事实上,可以认为

1
int var;

因此,一个简单的指针表示:

1
const object* var;

变成

1
const int var;

而且你也不能改变指针点的地址And hence you can't change the address that the point point too,and thats all.为了防止数据的改变,你必须把它指向一个对象。