字符型常量是用单引号包含起来的一个字符,如‘a’, ‘b’;
字符串常量是用一对双引号包含起来的一堆字符,如"a"、”Hello word!" 等;
‘a’与“a”的区别:
字符 ‘a’ 在内存中占1字节, “a” 在内存中占2字节。“a” 的最后一个字符为’\0‘
’\0‘ 是一个转义字符,标记字符串内容结束
变量定义与赋值:
char c;
c = 'a'; //正确
c = "a"; //错误,不能把一个字符串赋值给一个字符型变量
char cc[] = "a"; //正确
用来存放字符数据的数组就是字符数组。
字符数组的初始化:
1)逐个字符赋给数组中的元素。
char c[10] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};
2)如果提供的初值个数和预定的数组长度相同,定义是可以省略数组长度,系统会自动根据初值个数确定数组长度:
char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};
3)如果初值个数大于数组长度,则做语法错误处理:
char c[8] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; //编译时会报错
4)如果初值个数小于数组长度,则只将这些字符赋给数组中前面的元素,其余的元素值可能给’\0’,也可能无法确定,所以强烈不建议使用这些无法确定的元素值。
char c[12] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};
‘\0’ 的ASCII码是0。
‘\0’ 称为字符串结束标志。C语言对字符串常量会自动在其末尾增加一个 ‘\0’ 作为字符串结束标记。
注意:’\0’ 会占一个字节
char c[10] = "I am happy"; //错误:数组c中必须要为'\0'字符留有位置
char c[11] = "I am happy"; //正确,刚好都能放下
字符串与字符的区别与联系:
char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};
char c[] = "I am happy";
上述两行代码不等价,因为后一种写法系统会自动在字符串末尾增加 ‘\0’ 。
但是下面两行代码等价(长度相同吗,内容相同):
char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '\0'};
char c[] = "I am happy";
字符串处理函数:
char str[100] = "hello word";
puts(str);
char str1[20] = "hello";
char str2[10] = "word";
strcat(str1,str2);
char str1[20] = "hello";
char str2[10] = "word";
strcpy(str1,str2);
char str1[] = "hello";
char str2[] = "hello";
strcmp(str1,str2);
char str[100] = "hello word";
int len = strlen(str);
注意:sizeof(a);a的变量类型所占内存的大小,与a的内容无关;
1)字符串表示形式
char str1[] = "hello word";
char str2[] = "hello word";
上述代码 st1与str2都是字符数组名,代表字符数组首地址。str1和str2所代表的地址不同。
const char* str1[] = "hello word";
const char* str2[] = "hello word";
上述两行代码中str1与str2指向的地址相同。
2)字符指针变量与字符数组
a、赋值方式:
例:
//1
char str1[100] = "hello word"; //定义时初始化
//2
char str1[100];
str1 = "helllo word"; //不允许这样赋值
//修改成如下可以
strcpy(str1,"hello word");
//3
const char *str2;
str2 = "hello word";
//正确,"hello word"是字符串常量,在内存中有固定地址,只是让字符指针str2指向了这个地址
b、指针变量值是可以改变的,即指针指向的位置可以改变。
例:
const char *str1 = "hello word";
str1 = str1 + 6; //原来指向字符'h',跳过6字节,正好指向word
printf("%s",str1); //word
//数组名虽然代表数组首地址,但其值不能改变:
char str2[] = "hello word";
str2 = str2 + 6://错误,因为数组名代表的数组首地址值是不能发生改变的
printf("%s",str2);
string 类型是一个标准库中的类型,代表一个可变长字符串。
string与char可以相互转换
1) string 转 const char*
有两个函数:
c_str(();
data();
例:
string str = "hello word";
const char *str1 = s1.c_str();
const char *str2 = s1.data();
注:只能转换成const char*,如果去掉const编译不能通过。
2)string 转 char*
copy();
例:
string str = "hello word";
char *data;
int len = s1.length();
data = (char *)malloc((len + 1)*sizeof(char));
str .copy(data, len, 0);
data[len] = '\0';
3)char* 转 string
直接赋值
string str;
char *str1 = "hello word";
str = str1 ;
4)char[] 转 string:
直接赋值
string str;
char str1[] = "hello word";
str = str1 ;
5)string 转 char[]:
char str1[100];
char str2[100];
string str("hello word");
strcpy(str1, str.c_str());
strncpy(str2, str.c_str(), str.length());
str1[str.length()] = '\0';
str2[str.length()] = '\0';
1)const char *p;
p称为常量指针
p所存放的地址中的内容不能通过p改变。
例:
char str[] = 'hello word';
char *p;
p = str;
*p = ‘Y';
p++; //p可以指向不同位置,只要这些位置的内存归我们管理即可
//若定义为:
const char *pp;
//则pp指向的内容不能通过pp来修改(pp所指向的目标,哪个目标中的内容不能通过pp来修改)。
//pp称为常量指针
pp = str;
*pp = 'Y'; //错误
str[0] = 'Y'; //正确
2)char const * p; 等价于 const char *p;
3)char * const p;
p称为指针常量
p所存放的地址不能改变
例:
char str[] = "hello word";
char * const p = str; //定义的时候必须初始化
p++; //错误,p指向一个内容后,不可以再指向其他内容(p不可以指向不同地址)
*p = 'Y'; //正确,可以修改指向的目标中的内容
4)const char * const p; 或 char const * const p;
接合了 1)-3),表示p的指向不能改变,p指向的内容不能通过p改变。
p所存放的地址不能改变,p所存放的地址中的内容也不能通过p改变。