C语言的字符串和字符数组的区别在哪里?

如题所述

赞同以上的网友说的处理方式不同,我来完善一下。
一、字符串
"ABC"//这是一个字符串常量(也叫字符串字面量)

上面的例子就是一个字符串,看似其有3个字符,实际上的处理是4个字符,包括C后面的'\0'字符也就是空字符null。编译器遇到空字符就结束处理了。
在编程中也可以把字符串放到字符串数组当中处理:
char str1[] = "ABC";//编译器会自动计算字符串的长度
char str2[20] = "ABC";//这是一个字符串数组
用双引号括起来的内容被视为指向该字符串储存位置的指针,类似于把数组名作为指向该数组位置的指针。
也可以这样初始化一个字符串数组:
char str3 [4] = {'A','B','C','\0'};//字符串的数组的长度要确保比字符串长度多1以便为了容纳'\0'
注意:没有最后的空字符,这就不是一个字符串,而是一个字符数组,所有未被初始化的元素都被自动初始化为空字符'\0'。
不要这样初始化字符串数组:
char dont [] = {'A','B','C'};
这样编译器会不知道从哪里停止,直到找到内存中最近的一个空字符,好在内存中空字符很多,不会花费太长时间。

二、字符数组
字符数组与字符串数组的最大区别是处理范围不同,字符串数组遇到空字符便结束,而字符数组可以根据编程者的需要控制处理的长度。但是和字符串数组一样的是,字符数组的最后一个字符也一定是空字符,如下的初始化无法通过编译:
char str4 [1] = {'A','B'};//错误:初始值设定太多

声明数组时(包含字符数组),数组大小必须是可求值的整数。在C99新增变长数组之前,数组的大小必须是整型常量,包括由整型常量组成的表达式。
int n = 8;
char str5[2*sizeof(int)+1];//有效
char str6[n];//c99后有效的变长数组
在不越界的情况下,开发者可以根据需要编程处理字符数组。
与处理字符串不同,碰到空字符编译器会继续处理空字符后面的数据。
例如:
char str7 [3] = {'A','\0','C'};
str7[1] = 'B';
温馨提示:答案为网友推荐,仅供参考
相似回答