指向const的实际用法

时间:2014-05-31 06:10:42

标签: c++ c pointers

我理解指针用于strlen实现的常量。

size_t strlen ( const char * str );

任何人都可以提出其他原因或提供某些情况,其中“指向const值的指针”在实践中很有用。

3 个答案:

答案 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值的主要用途。