使用指针修改 C++ 初学者---字符串

c++ beginner---string modification using pointer

本文关键字:初学者 字符串 C++ 修改 指针      更新时间:2023-10-16

我刚刚开始学习指针和数组之间的关系。我从这个线程中读到的(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,以使您能够更改其内容。