我正在读Kenneth Reek的书《Pointers on C
》这本书谈到了常量指针
什么是指向整数的常量指针?
在它们中,指针是常数(这意味着什么?(它的值不能改变(它的值不应该是cpi=5
的值吗?5是应该读为常数整数的常数的值吗,或者常数是一回事,整数是另一回事——请澄清(书继续说but u are free to modify integer to which points to
,所以基本上我可以做cpi=5
,在下一行cpi=19
,那么我为什么需要它们使其成为常数?对我们所取得的成就有一个恒定的指针。
int * const cpi;
作者还说int constant *pci
是一个指向常量整数的指针。因此我可以更改指针值(Q:我如何更改指针值?你能举个例子吗(
这个int * const cpi
和const
在*
的右侧意味着指针本身不能更改为指向其他地方。它的用途不多,基于指针的查找表几乎是唯一常见的用例。它们还用于将指针存储在嵌入式系统的非易失性闪存中,而不是RAM中。
const int* cpi
是更常见的用法,这意味着指向的数据是只读的。这在编写const corrective函数接口等时使用。
为了使事情更加混乱,C允许您重新排序类型限定符const
和类型说明符int
,因此int const*
的含义与const int*
完全相同。
#include <stddef.h> // NULL
int main(void) {
int foo = 42;
int *ip = &foo; // can change both `ip` and `*ip`
int *const icp = &foo; // cannot change `icp`, can change `*icp`
const int *cip = &foo; // can change `cip`, cannot change `*cip`
const int *const cicp = &foo; // cannot change `cicp`, cannot change `*cicp`
ip = NULL; // ok
ip = &foo; // so that next line works
*ip = -1; // ok
// icp = NULL; // nope
*icp = -1; // ok
cip = NULL; // ok
// *cip = -1; // nope
// cicp = NULL; // nope
// *cicp = -1; // nope
int *const *j; // can change `j`, cannot change `*j`, can change `**j`;
}
指针(1(的值与指针指向(2(的值之间存在差异。因此,指向常量的指针(适用于(2((和常量指针(应用于(1((之间也有区别。最好的解释是";Constness";官方文档中指针声明页面的部分。
但一般情况下:
(1(指针是一个变量,用于保存内存中插槽的地址。在这个地址下可以有一些值(例如整数(,可以使用解引用运算符*访问。因此,当更改指针的值时,您正在更改它所指向的内存中的地址,但如果您有一个指向对象的常量指针,则无法执行此操作:int* const myPointer
(2(指针指向的值只是内存中的一个值。它也可以是某个变量的值。因此,您可以使用取消引用运算符*来更改指针指向的值:
int myValue = 5;
int* myPointer = &myValue;
std::cout << *myPointer << std::endl; // prints: 5
*myPointer = 13; // changing the value of a variable which pointer points to
std::cout << myValue << std::endl; // prints: 13
但如果您有一个指向常量的指针,则无法执行此操作:const int* myPointer