据我所知,标准strcmp函数看起来像这样:
int strcmp(const char* string1, const char* string2)
{
while(*pString1++ == *pString2++)
{
if(*pString1 == 0) return 0;
}
return *pString1 - pString2;
}
我的问题是这不会增加传递给strcmp的指针吗?在下面的示例中,它似乎会丢弃指针并导致无效的事情发生。
const char* string1 = "blah";
const char* string2 = "blah";
const char* string3 = "blah";
if(strcmp(string1, string2) {doSomething();}
// Won't this make string1 = "" because it incremented the pointer to the end?
else if (strcmp(string1, string3) {doSomethingElse();}
对不起,我只是感到困惑,因为看起来如果我将指针传递给strcmp,我不应该指望突然持有空字符串的指针。似乎strcmp应该采用const char * const。我完全误解了什么吗?
答案 0 :(得分:8)
你的误解是这样的:参数是通过值(副本)传递的,但你似乎认为它们是通过引用传递的。
您可以通过将参数声明为strcmp
作为参考来获得预期的行为,如下所示:
int strcmp(const char*& string1, const char*& string2)
答案 1 :(得分:4)
不,指针string1
和string2
是函数的本地(通过值传递)。调用者看不到对它们所做的任何更改。
答案 2 :(得分:1)
指针本身是按值传递的,所以虽然它是指向某个东西的指针,但改变它确实只会改变本地声明。
为了能够从函数的内部范围修改指针本身,您需要一个指向char的指针。
答案 3 :(得分:1)
指针按值传递,strcmp使用您发送的指针的副本,因此不会触及原始指针。
答案 4 :(得分:0)
首先,strcmp
的经典混淆实现是偶数
更简单:
int
strcmp(char const* s1, char const* s2)
{
while ( *s1 ++ == *s2 ++ )
;
return *s1 - *s2;
}
(我希望没有人会真正编写这样的代码 做法。)
至于你的实际问题:C ++(和C,因为这真的是C
问题)按值传递参数,因此strcmp
得到的任何指针都是
复印件;它不可能修改调用中的任何指针
码。所有制作参数char const* const
都意味着
strcmp
无法修改其指针的本地副本。
答案 5 :(得分:0)
C ++将参数传递给“按值”的函数。请考虑以下代码:
void f(int i) { i = 7; }
...
int j = 0;
f(j);
assert(j == 0);
变量j
与变量i
无关。实际上,i
是函数f
的本地。它使用j
的副本进行初始化。对i
的更改永远不会传达给j
。
现在考虑以下代码:
void f(char *i) { i = i + 1; }
...
char *j = "Hello";
f(j);
assert(*j == 'H');
同样,i
初始化为j
的副本。对i
的更改永远不会传回j
。
<小时/> 注意:可以强制参数“通过引用”进行初始化:
void f(int& i) { i = 7; }
...
int j = 3;
f(j);
assert(j==7);
在这种情况下,不是使用j
的副本初始化,i
绑定到j
。但这仅适用于声明中有&
的情况。
答案 6 :(得分:0)
试试这个,你会发现它们是完全不同的指针。 你误解的原因是他们指向同一个区域
#include <iostream>
using namespace std;
int strcmp2(char const *s1, char const *s2)
{
cout << "In strcmp" << endl;
cout << &s1 << " " << &s2 << endl;
cout << endl;
}
int main()
{
char a[100];
char b[100];
cout << "In main function" << endl;
cout << &a << " " << &b << endl;
cout << endl;
strcmp2(a, b);
}