为什么我不能传递字符串*而不是string []作为参数?

时间:2015-10-12 08:55:28

标签: c++ arrays pointers

int main(int args, char* argv[]) {
    string* list;
    listDevices(list);
    printf("device 0: %s\n", list[0]); // prints some junks
}

void listDevices(string* list) {
    list = new string[1];
    list[0] = "abc";
    printf("device 0: %s\n", list[0]); //prints "abc"
}

在上面的代码中,list数组被初始化并在listDevices方法中分配了一些值,但是当我在函数外部打印它时,会打印一些容器。

如果我将string list[1]作为输入发送到上述方法而不是发送string* list时(尽管两者都是指针),为什么它能正常工作?

3 个答案:

答案 0 :(得分:3)

您只能在()中更改指针的本地副本。 listDevices中的指针保持不变。您可能想要返回指向新列表的指针:

main

或者,您可以通过引用传递指针,但出于样式原因,我更喜欢return方法。

顺便说一下,您可能不需要首先使用指针和string *listDevices() { string *list = new string[1]; list[0] = "abc"; printf("device 0: %s\n", list[0]); //prints "abc" return list; } int main(int args, char* argv[]) { string *list = listDevices(); printf("device 0: %s\n", list[0]); // Will now work } 。最有可能的是,您的代码应该看起来像这样:

printf

答案 1 :(得分:2)

if (! $(this).text().trim().length ) list类型的变量,您可以按值传递。在方法中更改pointer-to-string本身不会将更改带到方法范围之外。

您希望通过引用传递它:

list

答案 2 :(得分:1)

您需要将list作为参考传递给函数:

void listDevices(string* &list) {
    list = new string[3];
    list[0] = "abc";
    printf("device 0: %s\n", list[0].c_str()); //prints "abc"
}

int main(int args, char* argv[]) {
    string* list=nullptr;
    listDevices(list);
    printf("device 0: %s\n", list[0].c_str()); //now prints "abc"
    // Don't forget to do `delete[] list` at the end !
    return 0;
}

注意:当您在问题中标记c++时,请检查this link,表明在.c_str()std::string时使用printf delete[] list 1}}。

警告:不要忘记最后ImageView