[英]Simple C++ pointer confusion
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
指针,并更改了该值,但实际上并没有改变它。
第二个我使用指针的指针,但也无法正常工作。
让我们逐步进行。
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"
。
在changeStr
函数的第一个版本中,参数str
被视为局部变量,并且由于对它们的所有局部变量的更改仅在实际函数内部进行了更改。
第二个版本将字符串作为参考传递。 基本上,这是当您指定应使用&
规范将变量作为引用传递时发生的情况:
void changeStr(char *&str)
在内部,编译器将引用作为指针传递。
要更改str的值,您必须通过引用将其传递。
一定像
void changeStr(char* &str)
这将确保变量通过引用传递,因此,如果您对函数中的变量进行任何更改,它将是全局更改。
您不应该使用赋值运算符将字符串存储在变量中,即使它是指针。 在包含string.h之后使用strcpy
void changeStr(char *str)
{
strcpy(str, "D");
}
这应该更改str指针指向的数据...甚至在进行函数调用的范围内...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.