void changeStr(char *str)
{
str = "D";
}
void changeStr(char **str)
{
*str = "S";
}
char str[] = "Good";
changeStr(str);
cout<<str<<endl;
char *p = str;
//*p = 'j';
changeStr(&p);
cout<<str<<endl;
我只是尝试更改该数组str[]
的值。没有回来!
我认为第一个changeStr
只传入str
的指针,并更改该值,但实际上并没有改变它。
第二个我使用指针指针但也无法工作。
答案 0 :(得分:6)
让我们一步一步来。
char str[] = "Good";
您正在创建一个包含以下内容的5个字符的字符数组:
{ 'G', 'o', 'o', 'd', '\0' }
changeStr(str);
在这里,您将该数组传递给函数。由于数组衰减成指针,这个调用完全没问题。
void changeStr(char *str)
{
str = "D";
}
现在,这是第一个问题。您可能会混淆"D"
和'D'
。如果要更改数组中的第一个字符,则需要按以下方式执行:
str[0] = 'D';
这样可以正常工作。更改指针不会做任何事情,因为它是一个局部变量,它保存指向数组开头的指针,而不是数组本身。如果您想仅使用{ 'D', '\0' }
替换数组的整个内容,则需要使用strcpy
。
strcpy(str,"D");
现在,让我们检查最后一部分。在这里你可以稍微混淆一下。
char *p = str;
changeStr(&p);
您正在创建一个指向数组开头的新变量,并将指向该变量的指针传递给下一个函数。
void changeStr(char **str)
{
*str = "S";
}
确实改变了传递的原始变量,但请记住,这不是数组p
。你所做的是改变p
点的位置。它现在指向常量"S"
。
答案 1 :(得分:1)
在changeStr
函数的第一个版本中,参数str
被认为是局部变量,并且因为所有局部变量的变化只会在实际函数内部发生变化。
第二个版本传递字符串作为参考。基本上,当您指定变量应作为&
规范的引用传递时会发生这种情况:
void changeStr(char *&str)
编译器在内部将引用作为指针传递。
答案 2 :(得分:0)
要更改str的值,您必须通过引用传递它。
必须像
void changeStr(char* &str)
这将确保变量通过引用传递,因此如果对函数中的变量进行任何更改,它将是一个全局变化。
答案 3 :(得分:0)
你不应该使用赋值运算符将字符串存储在变量中,即使它是一个指针。 包含string.h后使用strcpy
void changeStr(char *str)
{
strcpy(str, "D");
}
这应该改变str指针指向的数据......即使在进行函数调用的范围内......