C语言:字符串内容的修改

关于:

1)如何修改字符串的内容
2)char str[] = "We are happy.";char* sp = "We are happy."; 创建的字符串有什么不同

例1: 定义一个字符串,然后修改其最后的标点符号为 ”!“,打印字符串的内容和字符串地址:

# include <stdio.h>

int main()
{
	char str[] = "We are happy.";
	printf("%p \n", str);   // 00BBF900
	
	str[12] = '!';
	printf("%s \n", str);   // We are happy!
	printf("%p \n", str);   // 00BBF900
	
    return 0;
}

>>>
00BBF900
We are happy!
00BBF900

可见这样定义的字符串是可以直接在本体上修改其内容的,因为修改前后地址并没有变化。

例2: 定义一个指针指向字符串常量,然后尝试修改字符串的标点符号:

# include <stdio.h>

int main()
{
	char* sp = "We are happy.";
	sp[12] = '!';
	printf("%s \n", *sp);
	printf("%p \n", sp);
	
    return 0;
}

报错:写入访问权限冲突
在这里插入图片描述
先说结论:

  • char* sp = "We are happy." 无法修改字符串内容,因为这个字符串存放在内存的常量区
  • char str[] = "We are happy."可以修改字符串内容,因为这个字符串是存放在栈中的

解释:

当执行语句 char* sp = "We are happy." 时,计算机操作步骤:

1)程序加载字符串值,并存放到常量存储区,常量存储器的内容是只读的;
2)程序在栈上创建 sp 变量;
3)sp 变量设置为 "We are happy." 的地址;
3)若程序试图修改 sp 变量所指向的字符串内容就会报错,因为字符串在常量存储器,是只读的。

当执行语句 char str[] = "We are happy." 时,计算机操作步骤:

1)程序加载字符串值,并存放到常量存储区,常量存储器的内容是只读的;
2)程序在栈上初始化一个数组(分配空间),并自动保证该数组足够大以容纳字符串;
3)程序将字符串的内容复制到栈的数组内。

这两者的区别就在于: 定义指针的方法仅仅是 让指针指向了常量存储器中的字符串,而定义数组的方法是 得到了常量存储器中字符串的副本,所以定义数组的方法才可以修改字符串。

关于 C 语言中存储器的类型:

参考文章:C语言:存储器的类型

对用定义指针指向字符串的方法,补充一下指针 sp 里存的是字符串的地址,而字符串本体只有一个,就是常量区的字符串。

# include <stdio.h>

int main()
{
	char* sp = "We are happy.";
	
	printf("%s \n", sp);   // We are happy. 字符串本体
	printf("%p \n", sp);   // 0097EDBC  字符串的地址
	printf("&sp: %p\n", &sp);  // &sp: 00CFF744   指针的地址
	printf("*&sp: %s\n", *&sp); // *&sp: We are happy.  先取得指针的地址,然后取该地址下的指针变量所指向的值
	
	return 0;
}
>>>
We are happy.
0097EDBC
&sp: 00CFF744
*&sp: We are happy.

参考文章:
[1] C语言字符串的值是否可以被修改
[2] C语言:存储器的类型

  • 46
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃饭就会放大招

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值