Ваш пример в основном эквивалентен этому:
void changeString(string **strPtr) {
strPtr = new string*[1];
*strPtr = new string("hello");
//cout << strPtr[0][0];
}
int main()
{
string *strPtr;
changeString(&strPtr);
//cout << strPtr[0];
return 0;
}
И это в основном эквивалентно этому:
void changeString(string *strPtr)
{
strPtr = new string("hello"); // Changes the pointer, not the string!
//cout << strPtr[0];
}
int main()
{
string str;
changeString(&str);
//cout << str;
return 0;
}
В этот момент должно стать очевидным, что вы присваиваете новое значение указателю , а не указанному объекту. Учтите это:
void change(SomeType t)
{
t = somethingElse;
}
int main()
{
SomeType t;
change(t); // Does not change t.
}
В вашем случае SomeType
оказывается string*
(или string***
) - вы просто перезаписываете локальную переменную.
Чтобы исправить свой код, просто пропустите первую строку в changeString
:
http://coliru.stacked -crooked.com / а / 88874ee3601ef853
void changeString(string ***strPtr)
{
*strPtr = new string*[1];
**strPtr = new string("hello");
cout << strPtr[0][0][0];
}
int main()
{
string **strPtr;
changeString(&strPtr);
cout << strPtr[0][0];
return 0;
}