Есть две вещи, которые вы должны сделать, чтобы эта работа работала:
Во-первых, вы должны использовать динамически размещаемый массив, а не статически размещенный массив.В частности, измените строку
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";
}
и должен вызвать foo
, используя адрес оператора:
foo(&theStrings, 4);