问题引出——1
有问题的情况:
正常情况:
正常情况:
问题分析
可以看出主要矛盾是字符串型变量的初始化方式:
方式1: char p[] = "abcdefg";
方式2: char *p = "abcdefg";
按方式1初始化,则变量p对应的字符串可以更改;按方式2初始化,则变量p对应的字符串不可以更改
问题解决
归根结底,原因是C语言中的字符串是初始化在内存的常量区
😪当执行语句 char* p = "abcdefg" 时,计算机操作步骤:
1)程序加载字符串值,并存放到常量存储区,常量存储区的内容是只读的;
2)程序在栈上创建 p 变量;
3)将 p 变量的值设置为 "abcdefg" 的地址;
3)若程序试图修改 p 变量所指向的字符串内容就会报错,因为字符串在常量存储区,是只读的。
😪当执行语句 char p[] = "abcdefg" 时,计算机操作步骤:
1)程序加载字符串值,并存放到常量存储区,常量存储区的内容是只读的;
2)程序在栈上初始化一个数组(分配空间),并自动保证该数组足够大以容纳字符串;
3)程序将字符串的内容复制到栈的数组内。
😲这两者的区别就在于: 定义指针的方法仅仅是 让指针指向了常量存储器中的字符串,而定义数组的方法是 得到了常量存储器中字符串的副本,所以定义数组的方法才可以修改字符串,而定义指针的方法无法修改字符串
问题引出——2
奇怪现象:
问题分析
第一组值与第二组值都是以定义数组的方式声明字符串变量
第三组值与第四组值都是以定义指针的方式声明字符串变量
问题解决
"=="运算符本质上是比较两个变量的值是否相同。对于数组变量与指针变量而言,"=="运算符同样是比较两个变量的值是否相同,而数组变量与指针变量的值,就是它们所指向的地址
即"=="运算符就是比较数组变量与指针变量所指向的地址是否相同,而不是比较所指向的地址中存放的数据是否相同!!!
str1,str2,str3,str4是数组变量,它们所指向的地址各不相同(由问题1的解决得知: 栈区中将有4份"abcd"的copy,copy自常量存储区),所以结果为0与0。
str5,str6,str7,str8是指针变量,它们所指向的地址都是同一个地址(由问题1的解决得知:都是指向常量存储区中的同一个"abcd")。