使用指针修改 C++ 初学者---字符串
c++ beginner---string modification using pointer
我刚刚开始学习指针和数组之间的关系。我从这个线程中读到的(char a[] = ?string?; 和 char *p = ?string?;?)有什么区别,指针指向的字符串无法更改。但是在下面的代码段中,我可以毫无问题地将pa
指向的字符串从abc
更改为abd
。
int main()
{
char *pa;
pa="abc";
cout<<pa<<endl<<endl;
pa="abd";
cout<<pa<<endl<<endl;
return 0;
}
但是,它在此代码中不起作用。有人可以向我解释其中的区别吗?谢谢!!
int main()
{
char *pc;
pc="abc";
cout<<pc<<endl<<endl;
*(pc+2)='d';
cout<<pc<<endl<<endl;
return 0;
}
一种情况下,您没有更改字符串,实际上,正在发生的事情是首先您指向"abc"(pa="abc";
),然后您使指针指向"abd"(pa="abd";
),前一个字符串即"abc"在内存中保持不变。
在第二种情况下,您的pc
指针指向相同的字符串,并且语句*(pc+2) = d
尝试修改 pc 指向的值,这是无法做到的。
> @user3858我不知道您是否知道静态,自动和动态内存分配,但让我告诉您,"pa"是您的自动(指针)变量,最初指向静态内存区域" abc",后来您将其移至指向填充"abd"的其他内存区域。ABC"和"ABD"都是独立的区域。在您的第二个程序中,您实际上是在"abc"区域中进行更改以使其成为"abd",并且您遇到了错误。
通常,当程序运行时,字符串文本存储在只读内存中。 这是为了防止您意外更改字符串常量。这就是第二个示例中发生的情况,即您将获得分段错误错误。
这在您的第一个示例中没有发生,因为您没有更改字符串本身。相反,您只是将char *pa
从一个字符串更改为另一个字符串。
您可能需要查看:为什么在写入使用"char *s"而不是"char s[]"初始化的字符串时会出现分段错误?
附言如果您确实需要更改它的某些部分,我建议您使用 string
。
string pc = "abc";
pc[2] = 'd';
在这里,只读"abc"
被复制到非常量pc
中,以使您能够更改其内容。