2009-11-02 100 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