请看下面举例代码:
#include<stdio.h>
int main (){
char a[5]={'C','h','i','n','a'};//用 a[5]="China" 时,报错,说字符串太长了
char b[5];
for(int i=0;i<5;i++){
b[i]=a[i]+4;
}
printf("%s",b);
return 0;
}
上面的问题显然涉及到 字符串 与 字符数组 的区分问题
下面从我的角度(当然不一定正规,可能是错误的,如有错误也希望您来指正,共同进步)去解释:
字符串:
- 在C语言中,被解释为一个 以空字符 \0 结尾的字符数组,例如,当你声明一个字符串字面量如
"Hello"
时,它在内存中实际上是一个包含字符H
、e
、l
、l
、o
和一个结束符\0
的字符数组。 - 字符串常量可以直接赋值给字符数组,如
char str[] = "Hello";
,编译器会自动为字符串添加\0
- 字符串可以使用标准库中的字符串处理函数,如
strlen()
,strcpy()
,strcmp()
等,这些函数都依赖于\0
来判断字符串的结束
字符数组:
- 字符数组是一个元素类型为
char
的一维数组,它可以用来存储任何字符数据,不仅仅是构成字符串。 - 如果用来存储字符串,需要手动添加或由特定操作(如初始化时使用字符串字面量)加入
\0
来标记字符串的结束。 - 字符数组的大小固定,可以在声明时指定,也可以动态分配内存,但一旦分配,数组的容量不会改变。
- 不一定非要用来存储字符串,也可以存储任意字符序列,比如二进制数据、字符编码等,无需以
\0
结尾
总结:
他俩的主要区别在于 字符串特指以\0
结尾的字符数组,而字符数组更广泛,它可以包含任何字符序列,是否以\0
结尾取决于具体用途。
这是最常见的定义字符串的方式,数组中最后一个字符必须是空字符\0
,表示字符串的结束。
char str1[10] = "Hello"; // 注意:数组长度为10,但字符串"Hello"连同结束符'\0'共占6个位置,其余4个位置未使用。
char str2[] = "World"; // 编译器会自动计算字符串长度(包括'\0')并分配相应大小的数组空间。
这种方式实际上是让指针指向一个字符串常量,这个字符串常量通常存储在只读内存区域,因此不能修改
char *str3 = "Example"; // str3是一个指向字符串常量的指针,内容不能被修改。
当然 还有动态定义字符串:
char *str4;
str4 = (char*)malloc(10 * sizeof(char)); // 分配空间,不包括'\0'
strcpy(str4, "Dynamically"); // 使用strcpy复制字符串到分配的内存,需要包含<string.h>
// 记得在不再使用时释放内存 free(str4);