显然,我是一个大型俱乐部的成员,该俱乐部并不能正确理解C风格的指针。这是我的计划:
void changethestring (const char * thestring)
{
thestring = "string two";
}
int _tmain(int argc, _TCHAR* argv[])
{
const char * teststring = "string one";
changethestring(teststring);
printf("The string is: %s.\n", teststring);
return 0;
}
我的意图是changethestring()应该使指针指向"字符串2"。我的逻辑是我给函数一个指针。该函数应该能够将指针更改为指向内存中的其他区域。而且这种变化应该在功能之外持续存在。
但事实并非如此。在printf()语句中,字符串仍为"字符串1"。
任何人都可以解释为什么会这样,发生什么事情,以及如何编写函数changethestring()来更改指针所指向的字符串?
答案 0 :(得分:1)
您应该指向指针而不是指针。原因是在C中,所有参数都是按值发送的。因此,为了更改作为指针的变量的值,您需要发送一个指向此变量的指针,因此,指向指针的指针。
更新:您可以在changethestring
函数之外定义字符串文字,但不需要它,因为字符串文字在程序的整个生命周期中存储在全局字符串表中。所以这两个:
const char* STRING_TWO_LITERAL = "string two";
void changethestring (const char ** thestring)
{
*thestring = STRING_TWO_LITERAL;
}
int _tmain(int argc, _TCHAR* argv[])
{
const char * teststring = "string one";
changethestring(&teststring);
printf("The string is: %s.\n", teststring);
return 0;
}
和此:
void changethestring (const char ** thestring)
{
*thestring = "string two";
}
int _tmain(int argc, _TCHAR* argv[])
{
const char * teststring = "string one";
changethestring(&teststring);
printf("The string is: %s.\n", teststring);
return 0;
}
应该有用。
答案 1 :(得分:1)
通过按值传递指针,退出函数时它将返回到初始值 你应该像Ashalynd建议的那样通过引用传递它,或者你也可以为这个指针返回一个新值:
const char * changethestring (const char * thestring)
{
thestring = "string two";
return thestring;
}
int main(void)
{
teststring = changethestring(teststring);
}