我理解指针用于strlen
实现的常量。
size_t strlen ( const char * str );
任何人都可以提出其他原因或提供某些情况,其中“指向const值的指针”在实践中很有用。
答案 0 :(得分:2)
这样想。您希望我查看变量的值,但您不希望我以任何方式更改该变量,因此您将其作为常量传递给我。当我使用你的函数并看到一个参数是常数时,我知道你和我之间有一个契约,说我不应该改变那个变量的值,也不能直接这样做。
编写代码时,您始终不知道谁将使用您的功能。因此,保护代码是一种很好的做法。它还可以保护您自己,当您改变该变量的值时,您将收到编译器错误。
旁注:确实,在C中,即使参数显示const
,您仍然可以更改值,但是需要另一个指针来改变内存中该变量的内容。
尝试编译此代码并注意编译器如何保护您不会出错。
const char *cookies(const char *s)
{
return ('\0' == *s)? s: s + 1;
}
它不会让你编译,为什么?因为您正在尝试更改const
变量。
此处有同样问题的另一篇帖子:const usage with pointers in C
答案 1 :(得分:2)
将指针参数标记为const
是一个合约,您向用户断言您不会更改指向的值。它也是你不会尝试写给他们的合同,所以他们给你一个指向只读内存的指针是合法的,你的功能不会赢。崩溃 - 只要你履行这份合同。
它不仅仅是"有用",在某些情况下它是必需的,特别是当您处理的数量相当于写入受保护的内存(如字符串文字或存储在可执行文件代码部分中的任何值。
当您使用可能共享的数据时,它也很有价值:如果两个线程想要调用函数foo(char* x)
,则每个线程都需要自己的字符串副本,否则会发生不好的事情。如果函数是foo(const char* x)
,那么我们知道两者共享一个指向输入的指针是安全的。
考虑一下,如果你有一个指向写保护内存的指针:
mprotect(ptr, sizeOfData, PROT_READ);
现在无法调用在没有程序异常的情况下尝试写入ptr
的函数(当没有人在缓存上拥有写锁时,通常会执行缓存之类的操作)。
因此,此时你只能 调用ptr上的const函数。
答案 2 :(得分:0)
指向const的const的指针是字符串文字的类型(在“”中)。这是指向const值的主要用途。