我有一個簡單的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;
}
我有一個簡單的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;
}
因爲const char* str_
說str_是一個指向字符常量。
您可以更改str_本身,但不是它指向的內容。
int strLen(const char* str_)
{
str_ = (char*) 0; /* allowed */
str_[0] = '\0'; /* not allowed */
return 0;
}
在第一個,你所作出的修改指針str_
點;指針str_
不是const;它只是指向const數據。您可以使指針常量如下:
int strLen(const char* const str_)
如下的C聲明的公約,
char *str;
意味着*str
會給你一個char
(或者換句話說,str
是一個指針到一個炭)。同樣,
const char *str;
意味着*str
會給你一個const char
,或者換句話說,str
是一個指針到一個恆定的炭。因此,您不得更改*str
,但您可以更改str
。
如果你想str
本身const
,請使用以下語法:
char *const str;
並使用'const char * const str;'使所有內容保持不變,或者它是'char const * const str'? C中另一個不一致(實際上,這兩個聲明是等價的) – 2009-11-02 17:32:03
感謝。這很清楚。 – sivabudh 2009-11-02 01:08:03
更重要的是,這個指針是由* value *取得的,原來的函數絕對沒有任何東西! – rlbond 2009-11-02 02:25:29
rlbond提出了一個重要的觀點,在C中,參數是通過值傳遞的,所以如果函數修改了它的參數,那麼在該函數外面看不到任何變化。 – Artelius 2009-11-02 02:57:07