什么是指向interger或其他类型的常量指针



我正在读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 cpiconst*的右侧意味着指针本身不能更改为指向其他地方。它的用途不多,基于指针的查找表几乎是唯一常见的用例。它们还用于将指针存储在嵌入式系统的非易失性闪存中,而不是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

相关内容

最新更新