一、存储空间
字符数组:通常由字符串长度+1确定, 每个字符(包括’\0’)占用一个字节。
字符指针:存放字符串首地址,一般占用一个字长。
二、初始化
字符数组:
- 利用赋值语句对数组元素赋初值。
char name[10];
name[1] = 'w'; name[2] = 'o'; name[3] = 'r';
name[1] = 'd'; name[1] = '\0';
- 利用库函数(如scanf()函数),由用户为字符数组输入初值。
char name[10];
scanf("%s", name);
- 用字符常量作为初值,对字符数组初始化。
char name[5] = {'w', 'o', 'r', 'd', '\0'}
- 用字符串直接给数组赋值
char name[10] {"Beijing!"}
char s[] = {"word"}
char c[] = "word"
初值的个数可以小于数组的长度,反之编译时会语法错误。
字符指针:
由字符串常量进行初始化。
char *pstr = "hello, world“;
三、赋值
字符数组:
只能对单个元素赋值,不能用字符串赋值。
char s1[100], s2[100] = "world";
s1 = s2; //错误,应对s1每个元素逐一赋值,或者使用strcpy()函数
s1 = "believe"; //错误,字符串常量的存放按静态字符数组处理
字符指针:
可以用字符串赋值:
char *pstr; //注意野指针
patr = "hello, world";
四、地址值
**字符数组:**定义的字符数组在编译时分配内存单元,有确定的地址。
**字符指针:**定义指针变量时为它分配内存单元,但它的值未初始化,即尚未指向具体字符数据。
五、可变性
字符数组:数组名是常量,其值不可变。
字符指针:字符指针变量时变量,其值可变。如 pstr++;
例子
#include<stdio.h>
int main()
{
char s[] = "believe";
char* sp = s;
printf("sp = %s\n", sp); //<<believe
*(sp+1) = 'b';
printf("s = %s\n", s); //<<bblieve
printf("sp = %s\n", sp); <<bblieve
sp = "betray";
printf("sp = %s\n", sp); //<<betray
// *(sp+1) = 'b'; //错误,不能改变静态字符数组的值
// printf("sp = %s\n", sp);
return 0;
}
输出:
sp = believe
s = bblieve
sp = bblieve
sp = betray