【C++】char*如何修改

char*修改不了,但是可以用[]来申明字符串,这样字符串就能被修改了。
但操蛋的是,[]不能被赋值,char*可以被赋值。
void change(char *source){

    source[0] = 'D';

    cout<<source<<endl;
}

考虑一下,你有这么一个函数change它的作用是将传过来的字符串的第一个字符改成H,然后将这个字符串打印出来

谁知道这个函数为什么要这样呢?说不定编写这个函数的程序员的名字的第一个字母是D也说不定

 

好了,现在我们可以使用这个函数了

char a[] = "Peter";
change(a);

我们创建了一个字符串数组,它的内容是Peter,我们调用了change把Petter中的P改成了D,poor letter P,一切正常,我们得到了一个Deter。

 

现在有人使用了如下的代码调用change

char *a= "Petter";
change(a);

或者你觉得创建一个变量太麻烦了,于是你直接传递了一个字符串过去

change("Peter");

然后可怕的事情发生了,你的程序产生了异常,崩溃掉了,编译器会告诉你写入位置 xxx 时发生访问冲突或者类似的错误原因,于是开始抱怨change函数编写者,他编写的函数怎么会让你的程序崩溃了。

无辜的change编写者,在承受着你的埋怨,因为事实的真相却是你向change函数传递了一个无法被更改的字符串

 

好吧,让我们看下下面的代码

char *a = "Peter";
char b[] = "Peter";
char *c = new char[6];
strcpy_s(c, 6, "Peter");

a,b,c三个指针所指的内容都是peter,但这三个peter却位于不同的地方

a所指的Peter位于常量区

b所指的位于栈上

c所指的位于堆上

 

所以任何对a对source所指的内容的修改都会出现错误,但你可以让a指向一个新的地方,因为a是一个指针,如

a=b;

但对于位于栈上的b来说,你可以修改b所指的内容,却不能修改b

b=a;// error 不能修改b

我的理解:b被初始化过,长度为6,如果这时将一个char*赋值给b,那么是不能确定b能否容纳char*所有的字符串的,万一长度比6大,那该怎么办呢?所以C++直接杜绝了这种情况。

 

好了,让我们回过头来之前出错的那段代码

char *a= "Petter";
change(a);
change("Peter");

source所指的内容都是位于常量区的

所以任何对source所指的内容的修改都会出现错误

 

Remember

不要将一个字符串直接传递给一个函数或者赋值给一个char*类型的指针,除非你知道这个字符串中的字符的内容不会被改变

如何你可能会修改这个字符串的值,请使用char[],如果想使用字符串不变量,请使用const char*

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值