C语言:字符串内容的修改
关于:1)如何修改字符串的内容2)char str[] = "We are happy."; 和 char* sp = "We are happy."; 创建的字符串有什么不同例1: 定义一个字符串,然后修改其最后的标点符号为 ”!“,打印字符串的内容和字符串地址:# include <stdio.h>int main(){char str[] = "We are h...
关于:
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.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)