[英]Practical use of pointer to const
我理解在strlen
實現中使用指向常量的指針。
size_t strlen ( const char * str );
任何人都可以提出其他原因或提供一些“常量值”在實踐中有用的方案。
這樣想吧。 您希望我查看變量的值,但又不想讓我以任何方式更改該變量,因此您將其作為常量傳遞給我。 當我使用您的函數並看到一個參數是常量時,我知道您與我之間有一個約定,即我不應更改該變量的值,也不能直接執行該約定。
當您編寫代碼時,您並不總是知道誰會使用您的函數。 因此,保護您的代碼是一種好習慣。 它還可以保護您自己,避免您在更改該變量的值時遇到編譯器錯誤。
旁注:的確,即使參數說const
,您仍然可以在C中更改值,但是它將使用另一個指針,這將更改內存中該變量的內容。
嘗試編譯此代碼,並注意編譯器如何保護您避免出錯。
const char *cookies(const char *s)
{
return ('\0' == *s)? s: s + 1;
}
它不會讓您編譯,為什么? 因為您正在嘗試更改const
變量。
另一個帖子在這里有相同的問題: C中的指針的const用法
將指針參數標記為const
是一種約定,據此,您可以向用戶聲明不會更改所指向的值。 這也是您不會嘗試向他們寫的合同,因此他們向您提供指向只讀存儲器的指針是合法的,並且只要您滿足此要求,函數就不會崩潰合同。
它不僅是“有用的”,在某些情況下是必需的 ,尤其是在處理寫受保護的內存(例如字符串文字或可執行文件的代碼部分中存儲的任何值)的數量時。
當您使用可能共享的數據時,這也很有價值:如果兩個線程要調用函數foo(char* x)
每個線程都需要自己的字符串副本,否則會發生不好的事情。 如果函數是foo(const char* x)
那么我們知道共享一個指向輸入的指針是安全的。
考慮一下,如果您有一個指向寫保護存儲器的指針:
mprotect(ptr, sizeOfData, PROT_READ);
現在不可能在沒有程序異常的情況下調用試圖寫入ptr
的函數(這通常是在沒有人擁有高速緩存寫鎖的情況下通過高速緩存之類的東西完成的)。
因此,此時您只能在ptr上調用const函數。
指向char的const的指針是字符串文字的類型(“”內的字符)。 這是指向const值的指針的主要用途。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.