C++ 将字符数组传递到函数并修改它

5
我尝试编写一个函数,可以更改指定字符数组的内容。
void change_array(char *target)
{
    target="hi";
}

int main()
{
    char *a[2];
    change_array(a[1]);
    cout<<*(a[1]);
}

但是a[1]的内容仍然保持在0x0(void)。


3
有一些关于如何通过引用传递的答案,所以我要提出一个问题:“你应该这样做吗?”答案几乎肯定是“不,不应该”。为什么要使用 char* 而不是 std::string?如果你没有立即和紧迫的需要使用 C 字符串,我建议你使用 std::string。请注意,这只是翻译,不包括解释或其他额外的内容。 - anjruu
不,我有自己的理由使用字符串,因为我正在编写类似核心战争的程序,需要逐个单词读取字符数组。 - Echo
你可以使用 char** 来实现这一点。但我会选择 Anjruu 的解决方案,使用 string。 - hetepeperfan
1
@Echo: 这并不重要,您仍然可以使用std::string(或者对于这种用例来说更好的是std::vector<char>)来管理内存。这几行代码有一些问题:a未初始化保持在0x0处是不正确的,而是保留一个未确定的值。字符串字面值不是 char *(尽管出于历史原因编译器可能允许target =“hi”;,但如果您尝试修改它,则行为将是未定义的,并且很可能会崩溃... - David Rodríguez - dribeas
4个回答

3

首先,您的函数拥有传递给它的指针的副本,因此在调用方面没有任何效果。如果您想要修改函数参数,请传递一个引用:

void change_array(char*& target) { ... }
//                     ^

其次,您不能/不应该将非const指针绑定到字符串字面值。请改用const char*

void change_array(const char*& target) { ... }
//                ^^^^^      ^

int main()
{
    const char* a[2];
    change_array(a[1]);
    cout<<*(a[1]);
}

2

当你将参数传递给函数时,通常是按值传递的,这意味着它的值被复制了。如果你想改变它,你必须通过引用传递它。指针也是如此,如果你想改变一个指针,那么你也需要通过引用来传递它:

void change_array(const char*& target) { ... }

我现在是通过引用传递了吗? - Echo
如果您只想通过引用传递单个字符,可以使用指针来实现。但是,如果您想更改实际指针,则需要通过引用传递整个指针。在C++中,您可以使用“正确”的引用方式来实现,而不是使用指针。 - Some programmer dude

1

你需要将它作为引用传递:

void change_array(char*&target)
{
    target="hi";
}

否则,您只会更改target的本地副本,这不会对函数外部的值产生任何影响。

0
尝试使用这个设计:
std::string get_string()
{
    return "hi";
}

int main()
{
    std::string a[2];
    a[1] = get_string();
    std::cout<< a[1];
}

要点:

  • 按值返回
  • 使用std::string

我的真正目标不是展示字符串,而是为未来的工作真正改变它。 - Echo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接