目录
一、什么是字符串
"hello world"
由双引号引起来的一串字符成为字符串
字符串后有隐藏的字符串结束的标识符'\0'。
注意在在内存中也会多开辟一个字节存放'\0'!🙃
可用"strlen"来求字符串的长度。
例
char arr[] = "Hello World";
int st = strlen("Hello Worle");
- 得到结果为:11
- strlen()函数是计算字符串长度的,遇到字符串结束标识符就停止计算。返回结果不包含'\0'
- 因为"Hello World"是常量字符串,所以不需要进行声明定义!
注:"=="不能用来比较两个字符串是否相等,应该使用一个库函数 ---- strcmp(字符串1,字符串2)字符串1和字符串2是两个需要比较的字符串
二、字符串常量在内存中的存储
先说结论:字符串常量只要调用一次就会在常量池中创建,他的生命周期和程序的生命周期一样长。在工程中不管哪个阶段,只要是使用到已经在常量池中创建过相同的字符串常量,就会返回常量池中已经开辟的字符串常量的地址,即已经创建过的字符串常量就不会二次创建!🤯🤯
我们创建一个相同的字符串常量,用不同的数组来调用打印数组的内存
#include <stdio.h>
int main() {
char arr1[] = "Hello World";
char arr2[] = "Hello World";
printf("数组的第一个字节内容:arr1[0] = %c arr2[0] = %c\n", arr1[0], arr2[0]);
printf("数组的第一个字节地址:arr1[0] = %p arr2[0] = %p\n", arr1[0], arr2[0]);
printf("数组的地址:arr1 = %p arr2 = %p\n", arr1, arr2);
return 0;
}
得到的结果是:(手动对其)
数组的第一个字节内容:arr1[0] = H arr2[0] = H
数组的第一个字节地址:arr1[0] = 0000000000000048 arr2[0] = 0000000000000048
数组的地址: arr1[0] = 0000007C2C56F688 arr2[0] = 0000007C2C56F6B8
在上图我们也可以看出我们虽然在不同的数组中调用字符串常量,但是我们还是得到相同地址的字符串常量,这就可以说明不才上面说的结论是正确的。
三、字符串常量在内存中的生成过程与返回的地址
不才用视频演示:(当然,不才画的内存图是草图。想要了解详细C语言的内存分布的话,请各位看官自行搜查)
字符串常量在内存中的生成过程
从视频上我们可以了解到,字符串常量返回的首元素的地址,而且字符串常量在常量池中是一个连续的字节空间
四、变量修改字符串
若我们需要更改字符串常量,也不会把字符串常量删除,只是修改变量存储的地址
#include <stdio.h>
int main() {
char* a1 = "Hello World\0";
char* a2 = "abc";
a1 = "abc";
printf("%s\n", a1);
return 0;
}
- 结果为:abc
- 因为字符串常量返回的是首元素的地址,所以我们也可以用指针来接收
以上就是本章所有内容。若有勘误请私信不才。万分感激💖💖
ps:表情包来自网络,侵删🌹