2012-01-05 77 views
3

我正在學習C語言。爲什麼strlen的參數是「const」?

我的問題是: 爲什麼strlen的參數是「const」?

size_t strlen(const char * string); 

我想這是因爲字符串是一個地址,所以它不會在初始化後更改。如果這是正確的,那麼這是否意味着每次使用指針作爲參數構建函數時,都應該將其設置爲常量?

一樣,如果我決定建立,設置一個int變量的雙重功能,應該把它定義爲:

void timesTwo(const int *num) 
{ 
    *num *= 2; 
} 

void timesTwo(int *num) 
{ 
    *num *= 2; 
} 

或者它沒有什麼區別可言?

+2

你的一個'timesTwo'例子編譯;另一個沒有。 – 2012-01-05 18:45:03

回答

7

C字符串是一個指向零終止字符序列的指針。在char *前面的const向編譯器和調用函數的程序員指示strlen不會修改string指針所指向的數據。

這一點很容易,當你在strcpy明白:

char * strcpy (char * destination, const char * source); 

它的第二個參數是const,但它的第一個參數是沒有的。這告訴程序員,第一個指針指向的數據可能是被該函數修改的,而第二個指針指向的數據在從strcpy返回時將保持不變。

4

strlen函數的參數是一個指向const的指針,因爲該函數不會改變指針指向的內容 - 只希望在不改變它的情況下對該字符串執行某些操作。

在函數'timesTwo'中,如果你打算改變'num'指向的值,你不應該把它作爲const指針傳入。所以,使用第二個例子。

4

基本上,該函數很有前途,它不會通過該指針修改輸入字符串的內容;它表示*string可能不會被寫入。

這裏是const預選賽的各種排列:

const char *s;   // s may be modified, *s may not be modified 
char const *s;   // same as above 
char * const s;   // s may not be modified, *s may be modified 
const char * const s;  // neither s nor *s may be modified 
char const * const s;  // same as above 
相關問題