我正在读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是一个指向常量整数的指针。所以我可以改变指针值(问:我如何改变指针值,你能举个例子吗)
发布于 2021-05-11 18:51:55
这个const在*右侧的int * const cpi意味着指针本身不能指向其他地方。它的用途并不多,基于指针的查找表几乎是唯一比较常见的用例。它们还用于在嵌入式系统的非易失性闪存中存储指针,而不是RAM。
const int* cpi是更常见的用法,这意味着指向的数据是只读的。这是在编写常量正确性函数接口时使用的。
更令人困惑的是,C允许您对类型限定符const和类型说明符int进行重新排序,因此int const*的含义与const int*完全相同。
发布于 2021-05-11 19:00:34
#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`;
}发布于 2021-05-11 19:01:57
指针(1)的值与指针所指向的值(2)之间存在差异。因此,常量指针(适用于(2))和常量指针(适用于(1))之间也有区别。最好的解释是官方文档中Pointer declaration页面的"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的指针,你将无法做到这一点。
https://stackoverflow.com/questions/67484951
复制相似问题