C++ 指向常量的指针的实际使用

C++ 指向常量的指针的实际使用,c++,c,pointers,C++,C,Pointers,我了解如何使用指向常量的指针来实现strlen size_t strlen ( const char * str ); 任何人都可以提出其他原因或提供一些场景,其中“指针指向常量值”在实践中很有用。指针指向常量字符是字符串文本的类型(在“”中)。这是指针指向常量值的主要用途。这样想。你想让我看一个变量的值,但你不想让我以任何方式改变这个变量,所以你把它作为常数传递给我。当我使用你的函数,看到一个参数是常数时,我知道你和我之间有一个约定,即我不应该改变这个变量的值,也不能直接改变它 在编写代码时

我了解如何使用指向常量的指针来实现strlen

size_t strlen ( const char * str );

任何人都可以提出其他原因或提供一些场景,其中“指针指向常量值”在实践中很有用。

指针指向常量字符是字符串文本的类型(在“”中)。这是指针指向常量值的主要用途。

这样想。你想让我看一个变量的值,但你不想让我以任何方式改变这个变量,所以你把它作为常数传递给我。当我使用你的函数,看到一个参数是常数时,我知道你和我之间有一个约定,即我不应该改变这个变量的值,也不能直接改变它

在编写代码时,您并不总是知道谁将使用您的函数。因此,保护代码是一种很好的做法。它还可以保护您不受自己的影响,当您更改该变量的值时,您将收到编译器错误

旁注:的确,在C中,即使参数显示为
const
,您仍然可以更改该值,但它将使用另一个指针,该指针将改变内存中该变量的内容

试着编译这段代码,注意编译器是如何防止您出错的

const char *cookies(const char *s)
{
   return ('\0' == *s)? s: s + 1;
}
它不会让你编译,为什么?因为您正试图更改
常量
变量


另一篇文章也提出了同样的问题:

将指针参数标记为
const
是一种契约,您可以向用户声明您不会更改指向的值。这也是一个合同,你不会试图写给他们,所以他们给你一个指向只读内存的指针是合法的,你的函数不会崩溃-只要你履行这个合同

它不仅仅是“有用的”,在某些情况下它是必需的,特别是当您处理写入受保护内存的量时,例如字符串文本或存储在可执行文件代码部分的任何值

当您使用可能共享的数据时,它也很有价值:如果两个线程想要调用一个函数
foo(char*x)
每个线程都需要自己的字符串副本,否则会发生不好的事情。如果函数是
foo(const char*x)
,那么我们知道两者共享一个指向输入的指针是安全的

如果您有一个指向写保护内存的指针,请考虑:

mprotect(ptr, sizeOfData, PROT_READ);
现在,在没有程序异常的情况下调用试图写入
ptr
的函数是不可能的(这通常是在没有人拥有缓存写锁的情况下通过缓存之类的方式实现的)


因此,此时您只能在ptr上调用const函数。

您想在任何地方传递不可更改的内容而不复制它吗?(在C++中有其他的可能性)“你不会试图给他们写信,所以他们给你一个指向只写内存的东西的法律是”一个打字,不是吗?您指的是只读内存。您正试图在上面的代码中的什么位置更改
const
变量?