What use are const pointers (as opposed to pointers to const objects)?
我经常用指针指向常量对象,比如…
1 | const int *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中,
一种用法是在低级(设备驱动程序或嵌入式)代码中,需要引用映射到输入/输出设备(如硬件pin)的特定地址。有些语言允许您在特定的地址链接变量(例如,ADA有
其他时候,它只是防御性编码。如果你有一个指针不应该改变,那么最好声明它不能改变。这将允许编译器(和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.为了防止数据的改变,你必须把它指向一个对象。