字符串的基本概念
字符串是由零个或多个字符组成的有序序列,在C语言中以空字符'\0'(ASCII码为0)作为结束标志。
一个完整的字符串定义必须包含三个要素:
字符数组
有效的字符内容
结束符'\0'
实例:
#include <stdio.h>
#include <string.h>
int main() {
// 字符串的几种表示方式
// 1. 字符数组
char str1[20] = "Hello, World!";
// 2. 字符指针
char *str2 = "Hello, C Language!";
// 3. 直接初始化字符数组
char str3[] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
return 0;
相同的字符串字面量可能在内存中只存储一份
实例:
#include <stdio.h>
int main() {
// 实验1:字符串字面量的存储位置
char *str1 = "Hello"; // 存储在只读段
char *str2 = "Hello"; // 相同的字符串字面量
printf("str1地址: %p\n", (void*)str1);
printf("str2地址: %p\n", (void*)str2);
printf("是否相同地址: %s\n", str1 == str2 ? "是" : "否");
return 0;
}
字符串字面量存储在程序的只读段,不可修改
实例:
#include <stdio.h>
int main() {
// 实验2:字符串字面量的不可修改性
// str1[0] = 'h'; // 运行时错误:Segmentation fault
return 0;
}
字符数组会在栈上创建字符串的副本,可修改
实例:
#include <stdio.h>
int main() {
char arr1[] = "Hello"; // 栈上创建副本
char arr2[] = "Hello"; // 另一个副本
printf("arr1地址: %p\n", (void*)arr1);
printf("arr2地址: %p\n", (void*)arr2);
arr1[0] = 'h'; // 可以修改
return 0;
}