2009-11-02 99 views
2

我有一個簡單的C函數,我聲明如下:C:const vs no const ..怎麼這個編譯?

int strLen(const char* str_) 
{ 
    str_ = (char*) 0; 
    return 0; 
} 

我非常驚訝的是,編譯!這是爲什麼?

鑑於此onedoesn't編譯(這是有道理的):

int str(const int i_) 
{ 
    i_ = 0; 
    return 0; 
} 

回答

15

因爲const char* str_說str_是一個指向字符常量。

您可以更改str_本身,但不是它指向的內容。

int strLen(const char* str_) 
{ 
    str_ = (char*) 0; /* allowed */ 
    str_[0] = '\0'; /* not allowed */ 
    return 0; 
} 
+0

感謝。這很清楚。 – sivabudh 2009-11-02 01:08:03

+3

更重要的是,這個指針是由* value *取得的,原來的函數絕對沒有任何東西! – rlbond 2009-11-02 02:25:29

+0

rlbond提出了一個重要的觀點,在C中,參數是通過值傳遞的,所以如果函數修改了它的參數,那麼在該函數外面看不到任何變化。 – Artelius 2009-11-02 02:57:07

11

在第一個,你所作出的修改指針str_點;指針str_不是const;它只是指向const數據。您可以使指針常量如下:

int strLen(const char* const str_) 
6

如下的C聲明的公約,

char *str; 

意味着*str會給你一個char(或者換句話說,str是一個指針到一個炭)。同樣,

const char *str; 

意味着*str會給你一個const char,或者換句話說,str是一個指針到一個恆定的炭。因此,您不得更改*str,但您可以更改str

如果你想str本身const,請使用以下語法:

char *const str; 
+0

並使用'const char * const str;'使所有內容保持不變,或者它是'char const * const str'? C中另一個不一致(實際上,這兩個聲明是等價的) – 2009-11-02 17:32:03