我正在使用C中的strcmp
函数,然后我看到函数作为参数得到:
strcmp(_const char *s1, const char *s2)_;
实际上我通过了普通的char数组并且它有效。有没有想过为什么会这样?
答案 0 :(得分:4)
如果您有以下代码
char c = 'A';
char *p = &c;
const char *cp = &c;
那么这意味着您可以使用指针c
更改变量p
,但您不能使用指针cp
例如
*p = 'B'; // valid assignment
*cp = 'B'; // compilation error
因此函数声明
int strcmp(const char *s1, const char *s2);
表示在函数内部,s1和s2指向的字符串不会被更改。
答案 1 :(得分:2)
这很有用,因为允许传递非const代替const。另一种方式是禁止的:
char *hello = new char[20];
char *world= new char[20];
strcpy(hello, "hello");
strcpy(world, "world");
if (!strcmp(hello, world)) {
...
}
声明中的const
旨在告诉API的用户该函数不会修改字符串的内容。在C ++中,这很重要,因为字符串文字是const
。如果API中没有const
,则会禁止此调用:
if (!strcmp(someString, "expected")) { // <<== This would not compile without const
...
}
答案 2 :(得分:2)
有两种方法可以将const
关键字用于指针:
int my_int = 3;
const int* pt = &my_int; //prevent to modify the value that pointer pt points to
int* const ps = &my_int; //prevent to modify the value of pointer ps:
//it means the pointer is a const pointer, you can't modify the value of the pointer
//The value of the pointer ps is a memory address, so you can't change the memory address
//It means you can't reallocate the pointer(point the pointer to another variable)
int new_int = 5;
*pt = &new_int; //valid
*pt = 10; //invalid
*ps = &new_int; //invalid
*ps = 10; //valid
在strcmp
函数中,两个参数是指向const值的指针,这意味着当你将两个char数组或char指针传递给strcmp
函数时,该函数可以使用那些值两个指针指向,但该函数无法修改传递给它的值。这就是它起作用的原因。
const
引用以类似的方式工作。
答案 3 :(得分:0)
我认为您打算询问变量如何比较数组的机制。 如果是这样的话,
在您的示例中声明的指针存储了数组的第一个元素的初始地址和
字符串的结束点可以由检测空字符确定,而该空字符又是数组的结束地址。
用strcmp表示当指针指向字符串或传递的字符时,strcmp(&#34; string1&#34;,&#34; string2&#34;) ; 因此比较照常进行。
嗯,我猜这个以及周围发布的其他例子可以让你更好地了解你的答案。