在C中更改字符串指针

时间:2014-10-27 14:47:08

标签: c pointers

显然,我是一个大型俱乐部的成员,该俱乐部并不能正确理解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()来更改指针所指向的字符串?

2 个答案:

答案 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);
}