通过引用传递一个wchar数组

时间:2011-06-28 01:29:28

标签: c++ visual-c++ parameter-passing pass-by-reference

我想创建一个为数组分配内存的函数。假设我有这个:

PWSTR theStrings[] = { L"one", L"two", L"three" };

void foo(PWSTR a, int b) {
    a=new PWSTR[b];
    for(int i=0;i<b;i++) a[i]=L"hello";
    return;
}

int main() {
    foo(theStrings,4);
}

我的问题是,如何使函数foo和函数调用以便在调用foo之后,theStrings将包含四个“hello”

谢谢:) Reinardus

4 个答案:

答案 0 :(得分:2)

要做到这一点,你必须做两件事:

首先,您必须使用动态分配的数组,而不是静态分配的数组。特别是,改变行

PSWTR theStrings[] = { L"one", L"two", L"three" };

PWSTR * theString = new PWSTR[3];
theString[0] = L"one";
theString[1] = L"two";
theString[2] = L"three";

这样,你正在处理一个指针,它可以被修改为指向不同的内存区域,而不是使用固定部分内存的静态数组。

其次,你的函数应该是一个指向指针的指针,或一个指针的引用。这两个签名分别如下所示:

void foo(PWSTR ** a, int b); // pointer to pointer
void foo(PWSTR *& a, int b); // reference to pointer

引用指针选项很不错,因为您可以使用旧代码foo

void foo(PWSTR *& a, int b) {
    a = new PWSTR[b];
    for(int i=0;i<b;i++) a[i]=L"hello";
}

foo的调用仍然是

foo(theStrings, 4);

所以几乎没有什么必须改变。

使用指向指针的选项,您必须始终取消引用a参数:

void foo(PWST ** a, int b) {
    *a = new PWSTR[b];
    for(int i = 0; i<b; i++) (*a)[i] = L"hello";
}

并且必须使用address-of运算符调用foo

foo(&theStrings, 4);

答案 1 :(得分:1)

PWSTR theStrings[] = { L"one", L"two", L"three" };

void foo(PWSTR& a, int b) {
    a=new PWSTR[b];
    for(int i=0;i<b;i++) a[i]=L"hello";
    return;
}

int main() {
    PWSTR pStrings = theStrings;
    foo(pStrings,4);
}

但请注意,请考虑使用std::vectorstd::wstring等等。

另外,无论如何,请考虑使用函数结果(return)来表示函数结果,而不是in / out参数。

干杯&amp;第h。,

答案 2 :(得分:0)

如果您不需要使用PWSTR,则可以使用std::vector < std::string >std::valarray < std::string >

如果要存储unicode字符串(或宽字符),请将std::string替换为std::wstring

你可以在这里看到如何在CString / LPCTSTR / PWSTR和std :: string之间进行转换:How to convert between various string types

答案 3 :(得分:-1)

可能会将其更改为

void foo(PWSTR * a,int b)

foo(&amp; thestrings,4);