【发布时间】:2023-04-01 09:20:01
【问题描述】:
显然,我是一个大俱乐部的成员,只是不正确理解 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() 应该使指针指向“字符串二”。我的逻辑是我给函数一个指针。该函数应该能够将指针更改为指向内存中的不同区域。而且这种变化应该在函数之外持续存在。
但事实并非如此。在 printf() 语句中,字符串仍然是“字符串一”。
谁能解释这是为什么,幕后发生了什么,以及如何编写函数 changethestring() 来更改指针指向的字符串?
【问题讨论】:
-
thestring指向字符串。您需要更改指针本身。传递const char **并将行更改为*thestring = "string two"然后使用changestring(&teststring)调用 -
这里,
teststring(具有地址 0)包含一些内存地址,例如200,现在您将该地址提供给另一个变量thestring(具有地址 4)(这里,@ 987654329@ 得到了一份由teststring持有的副本)。现在,您在地址 4 所做的更改仍保留在地址 4。尽管您尝试在main中访问的内容实际上是在地址 0。我希望它有意义。 -
代码说明字符串是常量(即不可更改),因此分配应该在编译时失败。并且在执行时没有进行赋值,因为指针被定义为常量,所以不能更改。
-
您唯一更改本地版本的指针 thestring。您需要更改 _tmain() 中的实际指针,以便调用 changethestring(teststring);应该是 changethestring(&teststring);注意新的'&',所以它传递变量的地址而不是“字符串一”文字的地址。然后这一行: thestring = "string two";应该是 *thestring = "字符串二";